C#类的继承的一点说明

C#中类的继承是:从一个现有的类中派生新类的类的过程。
而通过继承,新类自动包括原来的类中的变量和方法。然后,按照需要裁剪这个类,程序员可以增加新的变量到派生类中或者修改继承的类。
总的来说,新类通过继承可以比重新编写,来更快、更容易和更廉价地创建。继承是支持软件重用的一种方式。(继承的目的就是重用现有的软件)。
但是最近看有的资料上说,在继承中子类并不继承父类的私有(private)成员。这种说法应该是错误的。让我们明确一下,在继承中,父类中定义的所有方法和变量,甚至是那些私有(prviate)成员,也由子类继承。只是这些私有成员不能通过类名或者类的相关对象直接引用。但它们可以间接引用。

让我们看一个例子来演示这种情况.

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace FoodAnalyzer
 6{
 7    /* FoodItem类表示了食物的一般类型。FoodItem的构造函数接收了脂肪的克数和食物的分数。
 8     * Claories方法根据脂肪来返回卡路里的大小,他触发了CaloriesPerServing方法来帮助计
 9     * 算每份的脂肪卡路里的大小*/

10     public class FoodItem
11    {
12        const int Calories_Per_Gram = 9;
13        private int fatGrams;
14        protected int servings;
15        public FoodItem(int numFatGrams, int numServings)
16        {
17            fatGrams = numFatGrams;
18            servings = numServings;
19        }

20        private int Calories()
21        {
22            return fatGrams * Calories_Per_Gram;
23
24        }

25        public int CaloriesPerServing()
26        {
27            return (Calories()/servings);
28        }

29    }

30    /*Pizzs类从FoodItem类派生,但是它没有增加特殊功能或者数据。它的构造函数使用了base
31     * 引用条用了FoodItem的构造函数,声明每个匹萨有8份*/

32    public sealed class Pizza : FoodItem
33    {
34        public Pizza(int fatGrams):base(fatGrams,8)
35        {
36 
37        }

38    }

39    /*Main方法实例化了一个Pizza对象,触发了一个方法来判断每份匹萨含有多少卡路里,基于他的脂肪含量。*/
40    class FoodAnalyzer
41    {
42        static void Main(string[] args)
43        {
44            Pizza special = new Pizza(275);
45            Console.Out.WriteLine("Calories per serving:"+special.CaloriesPerServing());
46            Console.In.ReadLine();
47        }

48    }

49}

50

Main方法中的称为special的Pizza对性用于触发CaloriesPerServing方法(public),它定义为FoodItem的Public方法,所以Pizza的对象肯定继承了此方法。注意CaloriesPerServing调用了Calories,它声明为私有可见性。并且,Calories引用了变量fatGrams和常量Calories_Per_Gram,它们也声明为私有可见性。
即使Pizza类不能显示引用Calories、fatGrams或者Calories_Per_Gram,当Pizza对象需要它们时可以间接使用它们。Pizzade对象不能用于触发Calores方法,但是它可以条用一个可以触发它的方法。注意从去这这个实例中我们没有创建或者需要FoodItem对象。
posted @ 2007-12-18 16:05  不染丹心  阅读(1111)  评论(0)    收藏  举报