小鱼儿-fly

c#,ASP.NET 一条艰辛而漫长的道路...千里之行,始于足下!

导航

C# 接口与抽象类

Posted on 2010-10-29 10:23  小鱼儿-fly  阅读(386)  评论(2编辑  收藏  举报

1. 抽象类

  • 抽象方法中作声明,不能包括实现,可以看成是没有实现体的虚方法
  • 抽象类不能被实例化
  • 抽象类可以但不是必须有抽象属性和抽象方法,但一旦有了抽象方法,就一定把这个类声明为抽象类。
  • 具体派生类必须覆盖基类的抽象方法。
  • 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。不覆盖,则其派生类必须覆盖。

2.接口

  • 不能被实例化
  • 只能包含方法声明
  • 成员包括:方法,属性,索引器和事件
  • 不能包含常量,字段,构造函数,析构函数,静态成员
  • 接口中的所有成员默认为public,因此接口中不能有private修饰符
  • 派生类必须实现接口中所有成员
  • 一个类可以直接实现多个接口,接口之间用逗号分开
  • 一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员

3.相同点:

  • 都可以被继承
  • 都不能被实例化
  • 都可以包含方法声明
  • 派生类必须实现未实现的方法

4.区别

  • 抽象类可以定义字段,属性,方法实现。接口中只能定义方法,属性,索引器和时间。不包含字段
  • 抽象类是一个不完整的类,需要进一步细化。而接口是一个行为规范。
  • 接口可以被多重继承,抽象类只能被单一继承
  • 抽象类更多是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中。
  • 抽象类是从一系列相关对象中抽象出来的概念,反映事物的内部共性。接口是为了满足外部调用而定义的一个功能约定,反映事物的外部特性

5. 使用规则:

  • 抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能 
    如果要设计大的功能单元,则使用抽象类;如果要设计小而简练的功能块,则使用接口。
  • 如果预计要创建组件的多个版本,则创建抽象类。接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
  • 如果创建的功能将在大范围的全异对象间使用,则使用接口;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
  • 分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”。为外部提供调用或功能需要扩充时优先使用接口
  • 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染
  • 尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如 asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则

出自:http://apps.hi.baidu.com/share/detail/14999238