1.抽象类
抽象类是特殊的类,它不能被实例化,只能作为其它类的基类而存在,其目的是抽象出子类的公共部分以减少代码重复。
抽象方法是一种特殊的虚方法,它只能定义在抽象类中,抽象方法没有任何执行代码,需要在派生类中用重写的方式具体实现(除非派生类依旧是抽象类)。
除了抽象方法外,我们还可以在抽象类中定义抽象属性。抽象属性也没有具体实现代码,必须在派生类中重写。
abstract class A{ public abstract void P(); }
一个抽象类的子类还是抽象类,除非子类实现了父类中所有的抽象方法。
class B:A{ public override void P(){ } }
总结:
抽象类不能产生对象
抽象方法没有方法体
抽象类中不一定包含抽象方法
含有抽象方法的类一定是抽象类
一个抽象类的子类仍旧是抽象类,除非它实现了父类中所有的抽象方法
2.密封类
密封类(Sealed class)是一种不能被继承的类,用 sealed 关键字声明。
同样,如果想防止一个方法被派生类重写,可以用 sealed 关键字把它为声明密封方法。
3.接口
飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
接口是引用类型的,类似于类,和抽象类的相似之处有:不能实例化;包含未实现的方法声明;派生类必须实现未实现的方法。
接口只是一个行为的规范或规定,接口的名称习惯上以字母 I 开头,微软的自定义接口总是后带able字段,证明其是表述一类“我能做……”。接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法。
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
接口中只能包含成员的声明,不能有任何实现代码。接口的成员总是公有的,不需要也不能添加public 等修饰符,也不能声明为虚方法或静态方法。
interface IFlyable{ //接口的成员总是公有的,不需要也不能添加public 等修饰符 void Fly(); } class Bird:IFlyable{ //子类中重写的方法其存取权限不能低于父类的 public void Fly(){ //只要有{},不是分号,一行代码没有也是实现 } } class Airplane:IFlyable{ public void Fly(){ } }
好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。