黑马程序员技术交流社区
标题: 又是继承 ==! [打印本页]
作者: 李伟斌 时间: 2012-12-3 21:27
标题: 又是继承 ==!
继承
一个类从另一个类派生出来时, 派生类从基类那里继承特性. 派生类也可以作为其他类的基类. 从一个基类派生出来的多层次类形成了类的层次结构.
在面向对象的编程中,有两种截然不同的继承类型 : 实现继承和接口继承.
·实现继承:
表示一个类型派生于一个基类型, 拥有该基类型的所有成员字段和函数. 在实现继 承中, 派生类型的每个函数采用基类型的实现代码, 除非在派生类型的定义中指定重写该 函数的实现代码. 在需要给现有的类型添加功能, 或许多相关的类型共享一组重要的公共 功能时,这种类型的继承是非常有效的.
·接口继承:
表示一个类型只继承了函数的签名, 没有继承任何实现代码.
在需要指定该类型具有某些可用的特性时, 最好使用这种类型的继承. 例如,某些类型可以指定从接口 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类作为所有类的基类.
·派生类应当是对基类的扩展. 派生类可以添加新的成员, 但不能除去已经继承的成员的定义.
·构造函数和析构函数不能被继承. 除此以外的其他成员, 不论对他们定义了怎样的访问方式, 都能被继承. 基类中成员的访问方式只能决定派生类能否访问他们.
·派生类如果定义了与继承而来的成员同名的新成员, 就可以覆盖已继承的成员, 但这并不意味着派生类删除了这些成员, 只是不能在访问这些成员.
类可以定义虚方法, 虚属性以及虚索引器, 他的派生类能够重载这些成员, 从而实现类可以展示出多态性.
作者: 许庭洲 时间: 2012-12-3 22:21
值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |