五、继承(Inherit)
5.1. 继承基础知识
为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块。C#这种完全面向对象的程序设计语言提供了两个重要的特性--继承性inheritance 和多态性polymorphism。
继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。
一个类从另一个类派生出来时,派生类从基类那里继承特性。派生类也可以作为其它类的基类。从一个基类派生出来的多层类形成了类的层次结构。
注意:C#中,派生类只能从一个类中继承。这是因为,在C++中,人们在大多数情况下是从多个类中派生的类。从多个基类中派生一个类这往往会带来许多问题,从而抵消了这种灵活性带来的优势。
C#中,派生类从它的直接基类中继承成员:方法、域、属性、事件、索引指示器。除了构造函数和析构函数,派生类隐式地继承了直接基类的所有非私有数据和行为以及新类为自己定义的所有其他数据或行为。
看下面示例:
using System;
class Vehicle //定义交通工具(汽车)类
{
protected int wheels; //公有成员:轮子个数
protected float weight; //保护成员:重量
private int han;//私有成员
public Vehicle() { ;}
public Vehicle(int w, float g)
{
wheels = w;
weight = g;
}
public void Speak()
{
Console.WriteLine("交通工具{0}的轮子个数{1}是可以变化的! ",wheels,weight);
}
}
class Car : Vehicle //定义轿车类:从汽车类中继承
{
int passengers; //私有成员:乘客数
public Car(int w, float g, int p)
: base(w, g)
{
wheels = w;
weight = g;
passengers = p;
}
}
class Test
{
static void Main()
{
Car c = new Car(2,2.0f,8);
c.Speak();
}
}
Vehicle 作为基类,体现了"汽车"这个实体具有的公共性质:汽车都有轮子和重量。Car 类继承了Vehicle 的这些性质,并且添加了自身的特性:可以搭载乘客。
5.2、C#中的继承符合下列规则:
1、继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object 类作为所有类的基类。
2、派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
3、构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
4、派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
5、类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
6、派生类只能从一个类中继承,可以通过接口实现多重继承。
下面的代码是一个子类继承父类的例子:
using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("父类构造函数。");
}
public void print()
{
Console.WriteLine("I'm a Parent Class。");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("子类构造函数。");
}