继承 一个类从另一个类派生出来时, 派生类从基类那里继承特性. 派生类也可以作为其他类的基类. 从一个基类派生出来的多层次类形成了类的层次结构. 在面向对象的编程中,有两种截然不同的继承类型 : 实现继承和接口继承. ·实现继承: 表示一个类型派生于一个基类型, 拥有该基类型的所有成员字段和函数. 在实现继 承中, 派生类型的每个函数采用基类型的实现代码, 除非在派生类型的定义中指定重写该 函数的实现代码. 在需要给现有的类型添加功能, 或许多相关的类型共享一组重要的公共 功能时,这种类型的继承是非常有效的. ·接口继承: 表示一个类型只继承了函数的签名, 没有继承任何实现代码. 在需要指定该类型具有某些可用的特性时, 最好使用这种类型的继承. 例如,某些类型可以指定从接口 System.IDisposable 中派生, 从而提供一种清理资源的方法 Dispose(). 由于某种类型清理资源的方式可能与另一种类型的完全不同, 所以定义通用的实现代码是没有意义的, 此时就适合使用接口继承. 接口继承常常被看做提供了一种契约 : 让类型派生于接口, 来保证为客户提供某个功能. C#中, 派生类从它的直接基类中继承: 方法,字段,属性,事件,索引器. 除了构造函数和析构函数, 派生类隐式的继承了直接基类所有成员. C#不支持多重继承, 但允许类型派生于多个接口. 结构和类: ·结构总是派生于System.ValueType, 不支持实现继承, 但可以派生于任意多个接口. ·类总是派生于用户选择的另一个类, 也可以派生于任意多个接口. using System; class Vehicle //定义汽车类 { public int wheels; //公共成员, 轮子数 protected int weight; // 保护成员: 重量 public Vehicle(){} public Vehicle(int wheels,int weight) { this.wheels=wheels; this.weight=weight; } public virtual void Speak() { Console.WriteLine("the vehicle speaking!"); } } class Car : Vehicle { int passengers; // 私有成员: 乘客数 public Car(int wheels,int weight,int passengers):base(wheels,weight) { this.wheels=wheels; this.weight=weight; this.passengers=passengers; } public override void Speak() { Console.WriteLine("the car Di-Di"); } } class Truck : Vehicle { int load; //私有成员: 载重量 public Truck(int wheels,int weight,int load):base(wheels,weight) { this.wheels=wheels; this.weight=weight; this.load=load; } public override void Speak() { Console.WriteLine("the truck Ba-Ba"); } } class Program { static void Main() { Vehicle[] vs={ new Car(4,2,5), new Truck(10,5,50), new Truck(10,5,60), new Car(3,2,4), new Vehicle() }; foreach(var v in vs) { v.Speak(); } } } C# 中的继承符合下列规则: ·继承是可以传递的. 如果 C 从 B 中派生, B 又从 A 中派生, 那么 C 不仅继承了 B 中声明的成员, 同样也继承了 A 中的成员. Object类作为所有类的基类. ·派生类应当是对基类的扩展. 派生类可以添加新的成员, 但不能除去已经继承的成员的定义. ·构造函数和析构函数不能被继承. 除此以外的其他成员, 不论对他们定义了怎样的访问方式, 都能被继承. 基类中成员的访问方式只能决定派生类能否访问他们. ·派生类如果定义了与继承而来的成员同名的新成员, 就可以覆盖已继承的成员, 但这并不意味着派生类删除了这些成员, 只是不能在访问这些成员. 类可以定义虚方法, 虚属性以及虚索引器, 他的派生类能够重载这些成员, 从而实现类可以展示出多态性. |