继承概述
继承是面向对象编程最重要的特性之一,它表示可以从一个类中派生出新的类,而且新类能继承基类的成员。在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性等,并且增强了代码的可重用性。
在面向对象编程中,被继承的类称为父类或基类,继承的类称为子类或派生类。C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类,但是可以继承多个接口。
继承一个类时,类成员的可访问性是一个重要的问题。子类(派生类)不能访问基类的私有成员,但是可以访问其公共成员,这就是说,只要使用public声明类成员,就可以让一个类成员被基类和子类(派生类)同时访问,同时也可以被外部的代码访问。
为了解决基类成员访问问题,C#还提供了另外一种可访问性:protected,只有子类(派生类)才能访问protected成员,外部代码不能访问protected成员。
除了成员的保护级别外,还可以为成员定义其继承行为。基类的成员可以是虚拟的,成员可以由继承它的类重写。子类(派生类)可以提供成员的其他执行代码,这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问他们。如果没有提供其他执行方式,外部代码就直接访问基类中成员的执行代码。
另外,基类还可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。
继承的基石——接口
接口是面向对象中一个非常重要的概念,而且,面向对象中的继承性和多态性主要都是通过接口来体现的。
1.接口概述
接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为,可以把它看成是实现一组类的模板。接口可由方法、属性、事件和索引器或这4种成员类型的任何组合构成,但不能包含字段。
类和结构可以像类继承基类一样从接口继承,但是可以继承多个接口。当类或结构继承接口时,它继承成员定义但不继承实现。若要实现接口成员,类或结构中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。类或结构的属性和索引器可以为接口中定义的属性或索引器定义额外的访问器。例如,接口可以声明一个带有get访问器的属性,而实现该接口的类可以声明同时带有get和set访问器的同一属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。
另外,接口也可以继承其他接口,类可以通过其继承的基类或接口多次继承某个接口,在这种情况下,如果将该接口声明为新类的一部分,则类只能实现该接口一次。如果没有将继承的接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员;在这种情况下,继承接口的类可通过重写虚拟成员来更改接口行为。
综上所述,接口具有以下特征:
q 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员;
q 不能直接实例化接口;
q 接口可以包含事件、索引器、方法和属性;
q 接口不包含方法的实现;
q 类和结构可从多个接口继承;
q 接口自身可从多个接口继承。
说明: