一抽象类
抽象类是特殊的类只是不能被实例化除此以外具有类的其他特性重要的是抽象类可以包括抽象方法这是普通类所不能的抽象方法只能声明于抽象类中且不包含任何实现派生类必须覆盖它们另外抽象类可以派生自一个抽象类可以覆盖基类的抽象方法也可以不覆盖如果不覆盖则其派生类必须覆盖它们
二接口
接口是引用类型的类似于类和抽象类的相似之处有三点
不能实例化
包含未实现的方法声明
派生类必须实现未实现的方法抽象类是抽象方法接口则是所有成员(不仅是方法包括其他成员)
另外接口有如下特性
接口除了可以包含方法之外还可以包含属性索引器事件而且这些成员都被定义为公有的除此之外不能包含任何其他的成员例如常量域构造函数析构函数静态成员一个类可以直接继承多个接口但只能直接继承一个类(包括抽象类)
三抽象类和接口的区别
类是对对象的抽象可以把抽象类理解为把类当作对象抽象成的类叫做抽象类而接口只是一个行为的规范或规定微软的自定义接口总是后带able字段证明其是表述一类类我能做抽象类更多的是定义在一系列紧密相关的类间而接口大多数是关系疏松但都实现某一功能的类中
接口基本上不具备继承的任何具体特点它仅仅承诺了能够调用的方法;
一个类一次可以实现若干个接口但是只能扩展一个父类
接口可以用于支持回调而继承并不具备这个特点
抽象类不能被密封
抽象类实现的具体方法默认为虚的但实现接口的类中的接口方法却默认为非虚的
当然您也可以声明为虚的
(接口)与非抽象类类似抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现但是允许抽象类将接口方法映射到抽象方法上
抽象类实现了oop中的一个原则把可变的与不可变的分离抽象类和接口就是定义为不可变的而把可变的座位子类去实现
好的接口定义应该是具有专一功能性的而不是多功能的否则造成接口污染如果一个类只是实现了这个接口的中一个功能而不得不去实现接口中的其他方法就叫接口污染
尽量避免使用继承来实现组建功能而是使用黑箱复用即对象组合因为继承的层次增多造成最直接的后果就是当你调用这个类群中某一类就必须把他们全部加载到栈中!后果可想而知(结合堆栈原理理解)同时有心的朋友可以留意到微软在构建一个类时很多时候用到了对象组合的方法比如中Page类有Server Request等属性但其实他们都是某个类的对象使用Page类的这个对象来调用另外的类的方法和属性这个是非常基本的一个设计原则
如果抽象类实现接口则可以把接口中方法映射到抽象类中作为抽象方法而不必实现而在抽象类的子类中实现接口中方法
四抽象类和接口的使用
如果预计要创建组件的多个版本则创建抽象类抽象类提供简单的方法来控制组件版本
如果创建的功能将在大范围的全异对象间使用则使用接口如果要设计小而简练的功能块则使用接口
如果要设计大的功能单元则使用抽象类如果要在组件的所有实现间提供通用的已实现功能则使用抽象类
抽象类主要用于关系密切的对象而接口适合为不相关的类提供通用功能
以下是我在网上看到的几个形象比喻真的非常不错呵呵:
飞机会飞鸟会飞他们都继承了同一个接口飞但是F属于飞机抽象类鸽子属于鸟抽象类
就像铁门木门都是门(抽象类)你想要个门我给不了(不能实例化)
但我可以给你个具体的铁门或木门(多态)而且只能是门你不能说它是窗(单继承)一个门可以有锁(接口)也可以有门铃(多实现) 门(抽象类)定义了你是什么接口(锁)规定了你能做什么(一个接口最好只能做一件事你不能要求锁也能发出声音吧(接口污染)