This article is currently in the process of being translated into Chinese (~93% done).
Inheritance
面向对象编程(OOP)的一个绝对关键特征,也是C#建立的基础,就是继承,通过从父类继承某些特征而生成新类的能力。整个.NET framework就是建立在这个概念的基础上的,即“所有东西都是对象”。即便一个简单的数字也是某个类的一个实例,而这个类又继承自System.Object类,虽然.NET在其中帮了点小忙,让你可以直接用一个数字来赋值,而不用先生成一个,比如说,integer类的的实例。
这个主题可能有点难讲得全面,不过有时用例子更好说明,因此让我们以其中一个简单的例子开始:
public class Animal
{
public void Greet()
{
Console.WriteLine("Hello, I'm some sort of animal!");
}
}
public class Dog : Animal
{
}我们先定义了一个Animal类,用一个简单的方法输出一段问候语。然后我们又定义了一个Dog类,通过使用冒号告诉C# Dog类继承自Animal类。这里美妙之处在于,这种关系在现实世界也是符合的 - 一只狗显然就是一个动物。来试试这个类:
Animal animal = new Animal();
animal.Greet();
Dog dog = new Dog();
dog.Greet();如果运行这个例子,你会发现,即使我们没有为Dog类定义Greet()方法,Dog实例仍然知道如何问候我们,因为它从Animal类继承了这个方法。不过这个问题有一点点不那么确实,因此,既然我们已经知道这是那种动物,那就把问候实现得具体一点:
public class Animal
{
public virtual void Greet()
{
Console.WriteLine("Hello, I'm some sort of animal!");
}
}
public class Dog : Animal
{
public override void Greet()
{
Console.WriteLine("Hello, I'm a dog!");
}
}除了Dog类中增加的方法外,还有两点需要注意:现在Aminal类的方法上加了virtual关键字,同时Dog类的同名方法上加了override关键字。
在C#中,除非类成员被标记为virtual,否则禁止覆盖。如果需要,仍然可以访问被继承的方法,即便已经被覆盖了,还是可以使用base关键字进行访问。
public override void Greet()
{
base.Greet();
Console.WriteLine("Yes I am - a dog!");
}然而方法并非唯一可以继承的。实际上,几乎所有的类成员都会被继承,包括字段和属性。只是要记住可见性规则,就象前面某章里讨论的那样。
继承也不仅限于从一个类到另一个类 - 你可以建立一整个类的分层结构,其中的类均继承自上一级。比如,我们还可以增加一个Puppy类,继承自Dog类,从而也间接地继承了Animal类。不过C#不能让一个类同时继承多个类。这个叫做多继承,是C#不支持的。