1.C# 接口与抽象类
接口
从“面向接口编程”的角度看,接口是一中思想层面上的用以实现多态、提高软件灵活性和可维护行性的架构部件。
从代码的角度来看,接口是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或这其他接口继承。
interface interfatceName
{
void Method1();
void Method2(int para1);
void Method3(string para2,string para3);
}
①接口不能被实例化
②接口只能包含方法声明
③接口的成员包括:方法声明、属性、索引器、事件
④接口中不能包含:常量、字段(域)、构造函数、析构函数、静态成员
⑤接口中的所有成员默认为public,因此接口中不能有private修饰符
⑥派生类必须实现接口的所有成员
⑦一个类可以直接实现多个接口,接口之间用逗号隔开
⑧一个接口可以有多个父接口,实现该接口的类必须实现父接口中的所有成员
⑨接口是对动作的抽象
⑩接口表示的是:这个对象能做什么
⑪接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约
⑫接口是引用类型的
抽象类
简单点说,含有abstract修饰符的类为抽象类,抽象类提供多个派生类共享基类的公共定义,能够提供抽象方法和非抽象方法。
抽象类不能被实例化,必须通过继承由派生类实现其抽象方法;
抽象类的派生类可以声明为抽象类,即抽象派生类,抽象派生类可以覆盖基类的方法也可以不覆盖,其非抽象派生类必须覆盖它们。
①抽象类不能被实例化
②抽象类中的抽象方法只作声明,不包含实现,可以看作没有实现的虚方法
③抽象类可以有抽象属性和抽象方法,但不是必须
④非抽象派生类必须覆盖基类的抽象方法
⑤抽象派生类可以覆盖基类的方法也可以不覆盖
⑥抽象类是对根源的抽象
⑦抽象类表示的是:这个对象是什么
⑧抽象类在代码实现方面发挥作用,可以实现代码重用
⑨抽象方法声明中不能使用static和virtual修饰符
相同点:
①都可以被继承
②都不能被实例化
③都可以包含方法声明
④派生类必须实现未实现的方法
不同点:
①抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、方法声明。
②抽象类是一个不完整的类,需要进一步细化。接口是一个行为规范。
③抽象类只能被单一继承。接口可以被多重实现。
④抽象类更多的是定义在一系列紧密相关的类中。接口大多数是关系疏松但都实现某一功能的类中。
⑤抽象类是从一系类相关对象中抽象出来的概念,因此反应的是事物的内部共性。接口是为了满足外部调用而定义的一个功能约定,因此反应的是事物的外部特性。
⑥接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法。
⑦接口可以用于支持回调,而继承不具备这个特点。
⑧抽象类实现的具体方法默认为虚。接口的类中方法默认是非虚的,当然可以声明为虚的。
⑨如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中的方法。
⑩抽象类只能作用于引用类型。接口可以作用于值类型和引用类型。