A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李伟斌 中级黑马   /  2012-12-3 21:27  /  1142 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

继承
      一个类从另一个类派生出来时, 派生类从基类那里继承特性. 派生类也可以作为其他类的基类.  从一个基类派生出来的多层次类形成了类的层次结构.
    在面向对象的编程中,有两种截然不同的继承类型 : 实现继承和接口继承.
·实现继承:  
       表示一个类型派生于一个基类型, 拥有该基类型的所有成员字段和函数. 在实现继  承中, 派生类型的每个函数采用基类型的实现代码, 除非在派生类型的定义中指定重写该 函数的实现代码.  在需要给现有的类型添加功能, 或许多相关的类型共享一组重要的公共 功能时,这种类型的继承是非常有效的.
·接口继承:  
       表示一个类型只继承了函数的签名, 没有继承任何实现代码.
    在需要指定该类型具有某些可用的特性时, 最好使用这种类型的继承. 例如,某些类型可以指定从接口 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类作为所有类的基类.
·派生类应当是对基类的扩展. 派生类可以添加新的成员, 但不能除去已经继承的成员的定义.
·构造函数和析构函数不能被继承. 除此以外的其他成员, 不论对他们定义了怎样的访问方式, 都能被继承. 基类中成员的访问方式只能决定派生类能否访问他们.
·派生类如果定义了与继承而来的成员同名的新成员, 就可以覆盖已继承的成员, 但这并不意味着派生类删除了这些成员, 只是不能在访问这些成员.
类可以定义虚方法, 虚属性以及虚索引器, 他的派生类能够重载这些成员, 从而实现类可以展示出多态性.

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马