日期:2014-05-20  浏览次数:20787 次

【请教】代码中,接口或抽象类分别在何种情况下使用?
大家好,我有以下疑问,请指教:

  背景:
  平时看到一些书籍资料中描述的,通过接口以及抽象类实现多态,可以有提高代码的可用性及维护方便等的优点。
  那么,除了在对外公开接口的这种情况外,在项目自身内部使用时,什么时候使用接口,什么时候使用抽象类呢?

谢谢!

------解决方案--------------------
和类的耦合有关系。。
------解决方案--------------------
如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。 
如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
抽象类 接口
------解决方案--------------------
只有方法属性申明的抽象类和接口几乎等价。

他们唯一的差别,在但根继承的类型系统中,抽象类只能单根继承,会很麻烦,这时候应当用接口。

很多情况下,我们不自觉地使用抽象基类,不会仅仅只是一些方法、属性的申明,绝大多数的程序员都会不自觉地把那些基类变成接口,因为那种基类就是一些功能契约,我们无法抽象出公用的代码。把接口反过来做成抽象基类的情况很少,因为重构次数越多,就会越倾向于使用接口。接口使用没有负担,特别是重构一些老的代码的时候,修改基类代价会很大,而接口只需要再申明一个,在需要提供的类上加上新的接口实现就可以了。如果是基类,那会搞得很繁琐,你必须提供一个默认实现的虚方法,有可能这些默认实现还不是完全一样的,你要么分割方法,要么在插入继承层次。

但是,并不是接口负担小,就会有人无限制的使用,毕竟接口没有任何的实现,并不减轻代码量。使用抽象基类,通常是因为我们发现了可重用的代码,在逻辑上,就是我们发现了一组对象具备某个相通的实现,不是相通的功能,而是实现,如果是相通的功能使用接口就可以了。有时候功能和实现很难区别,举个例子吧,计算1*2*3*4.....和1+2+3+4.....具有相同的实现,他们都会进行一个循环,并且每个循环都会作一个运算。我们可以这样设计,一个抽象基类,包含一个Coputer和一个Operation方法,Computer是实在的方法,利用Operation方法累进求值;Operation是一个抽象方法,两个子类分别实现了不同的Operation。一个做乘法,一个做加法。这就是典型的使用抽象基类的设计,因为我们发现了他们具备相通的实现逻辑。

额外说明一下,还有一种设计,上面的那个东西可以设计成,一个接受委托的静态函数,比如一个Computer方法其中包含一个委托参数,这个委托实现具体的Operation。这样的设计会好一些,因为上面的功能所具有的相通实现还不够复杂。但是,不管多复杂的耦合,最终还是可以完全不用抽象基类的。我以前见过的一个设计,就是一大堆的接口+静态工具类+工厂模式实现的,那个不叫做设计,那是程序员的耻辱。
------解决方案--------------------
探讨
C# code//在应用程序要求很多可能不相关的对象类型以提供某种功能的情况下,用接口适用性会更强;接口比基类更灵活,因为可以定义单个实现来实现多个接口;在无需从基类继承实现的情况下,接口更好;在无法使用类继承的情况下接口是很有用的。例如,结构无法从类继承,但它们可以实现接口。//1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。// 2.如果创建的功能将在大范?-