C#程序设计自学经典
上QQ阅读APP看书,第一时间看更新

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(); 
        }

抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。