5.2 继承
继承是面向对象编程最重要的特性之一。任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承(也称为派生)的类称为父类或者基类。在C#中,继承只支持单继承,即一个类只能有一个基类。单一继承已经能够满足大多数面向对象应用程序开发上的要求,也有效地降低了复杂性。如果必须使用多继承,可以通过接口来实现。
5.2.1 继承简述
利用类的继承机制,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序员可以在已有类的基础上构造新类。
下面通过一个具体的例子来讲解下类的继承。
例5-7:类的继承(ConsoleClassInheritance)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleClassInheritance { class Program { static void Main(string[] args) { Sun sun = new Sun(); sun.Calc(); sun.Show(); Console.ReadLine(); } } public class Father { public int num1 = 5, num2 = 3; public void Calc() { Console.WriteLine("{0} + {1} = {2}", num1, num2, num1 + num2); Console.WriteLine("我是基类的Calc方法"); } } public class Sun : Father { public void Show() { Calc(); Console.WriteLine("我是子类的Show方法"); } } }
运行结果如图5-7所示。
图5-7 类的继承
在此例中,声明了一个名为Father的类,Father类中声明并初始化了两个整型的变量num1和num2,并声明了一个名为Calc的方法,用于计算两数之和并输出相关信息。然后声明一个名为Sun的类,并继承于Father类。在C#中,声明类时,在类名后放置一个冒号,然后在冒号后指定要继承的类。Sun类中声明一个名为Show的方法,在Show方法内部直接调用了父类的Calc方法。最后在Main方法中初始化了子类Sun的对象,并调用了父类的Calc方法以及自己的Show方法。
5.2.2 抽象类及类成员
抽象类及类成员是不完整且必须在派生类中实现的类和类成员。其语法格式如下:
访问修饰符 abstract class 类名 { 类成员 }
如下代码片段演示了如何继承抽象类。
public abstract class Person { } public class Chinese : Person { }
抽象类不能实例化。抽象类的用途是提供一个可供多个派生类共享的通用基类定义。抽象类也可以定义抽象方法。方法是将关键字abstract添加到方法的返回类型的前面。如下代码片段演示了在抽象类中添加抽象方法。
public abstract class Person { public abstract void SayHello(); }
抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。