一、C#继承简介
1. 类的层次结构
下面是一个类的层次结构图:
上图反映了鱼类的派生关系,其中最高层的实体往往具有最一般最普遍的特征,越下层的实体就越具体,并且下层包含了上层的特征。如果将上层的实体比作基类,那么下层的实体就可以比作派生类,而基类也可以称为派生类的父类。
继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特征或者修改已有的基类的特性,以建立起类的新层次。
在C#中,继承是指能够从它的父类中继承除构造函数以外的所有数据的定义和功能。除构造函数和析构函数以外,派生类隐式地继承了直接基类的所有成员,其中就包括继承“方法、域、属性、事件和索引指示器”等成员。
2. 类的继承方式
类的继承方式为:在声明类时,在类名称后面加上冒号,在冒号后面指定要从中继承的类(基类)。
例如:
public class Vehicle // 定义汽车类,这是基类
{
public Vehicle(){}
}
public class Car : Vehicle // 定义轿车类,从汽车类中继承。这是派生类
{
public Car(){}
}
在上例中,派生类(新类)将获取基类的所有非私有数据和行为以及新类为自己定义的所有其它数据或行为。因此,新类具有两个有效类型:新类的类型和它继承的类的类型。
二、C#继承规则
1. C#中类的继承规则
C#中类的继承规则如下:
?继承是能够传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同时也继承了A中的成员。注意:Object类是所有类的基类。
?派生类应该是对基类的扩展。派生类可以添加新的成员,但是不能移除已经继承的成员的定义。
?构造函数和析构函数不能被继承。除此之外的其它成员,都能被继承。基类中成员的访问方式只能决定派生类是否能访问它们。
?派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。此时,派生类不能访问被覆盖的成员,不过,使用new修饰符可以声明具有相同名称或签名的新成员。
?类可以使用virtual修饰符定义虚方法、虚属性和虚索引指示器,它的派生类能够使用override修饰符来重载这些成员。
?派生类只能从一个类中继承,可以通过接口实现多重继承。
2. 示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
public class A // 基类
{
protected string name; // 受保护字段成员,可在当前类和派生类中访问
protected int age; // 受保护字段成员
public A(string name, int age) // 实例构造函数
{
this.name = name;
this.age = age;
}
public void ShowA()// 公共方法
{
Console.WriteLine("name:{0} age:{1}",name,age);
}
}
public class B : A // 这是派生类,以A作为基类
{
private int ID; // 派生类的成员
public B(int ID, string name, int age)
: base(name, age) // 调用直接基类的实例构造函数
{
this.ID = ID;
}
public void ShowB() // 公共方法
{
Console.WriteLine("ID:{0}", ID);
}
}
static void Main(string[] args)
{
// C#继承规则-www.baike369.com
B b = new B(100,"BaiXue",18);// 创建类的实例
b.ShowA(); // 调用基类的方法
b.ShowB(); // 调用自身类的方法
Console.ReadLine();
}
}
}
运行结果:
name:BaiXue age:18
ID:100