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

5
namespace FoodAnalyzer6
{7
/* FoodItem类表示了食物的一般类型。FoodItem的构造函数接收了脂肪的克数和食物的分数。8
* Claories方法根据脂肪来返回卡路里的大小,他触发了CaloriesPerServing方法来帮助计9
* 算每份的脂肪卡路里的大小*/10
public class FoodItem11
{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类派生,但是它没有增加特殊功能或者数据。它的构造函数使用了base31
* 引用条用了FoodItem的构造函数,声明每个匹萨有8份*/32
public sealed class Pizza : FoodItem33
{34
public Pizza(int fatGrams):base(fatGrams,8)35
{36
37
}38
}39
/*Main方法实例化了一个Pizza对象,触发了一个方法来判断每份匹萨含有多少卡路里,基于他的脂肪含量。*/40
class FoodAnalyzer41
{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对象。



浙公网安备 33010602011771号