2015-08-30 12 views
0

假设,我有2个配置。依赖注入:基于接口和类的松耦合机制之间的区别?

第一个:

interface I { 
    ... 
} 

class A implements I { 
    ... 
} 

class B implements I { 
    ... 
} 

class Component { 
    I i;  
    Component (I i) { 
     this.i = i; 
    } 
} 

二之一:

class C { 
    ... 
} 

class A extends C { 
    ... 
} 

class B extends C { 
    ... 
} 

class Component { 
    C c;  
    Component (C c) { 
     this.c = c; 
    } 
} 

在什么其中使用两个不同的松散耦合的机制(基于接口和基于类)这两个结构之间的差异?

为什么我需要使用接口而不是类?

+0

[编程接口](http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to- an-interface)非常详细地介绍了这一点。 –

回答

1

一个对象可以实现多个接口,但只能扩展一个类,所以有时松耦合库的用户可能无法扩展你的类。

当您扩展时,您将超类的代码合并到您的代码中,有时没有代码可以合并,因此实现更适合。

最后它不是同一个范例,当你写“B extends A”时,你说“我是A,我做同样的事情,但我也可以做其他事情”。当你写“B器具A”时,你会说“我是B,但你可以把我当作A”。长期以来,唯一的实际原因将是第一个。

1

主要是,使用类是一个更重的方法。基类通常包含具体(非抽象)方法。如果你从它们派生出来,你还需要继承这些你可能不想要的具体方法。

例如,假设您想从decorator pattern等组成设计模式中受益。在这里,你的装饰器也需要从基类派生并继承具体的方法。但是,你的装饰器不需要具体的方法来运行。

总之,如果您的抽象是基于类的,则更难/不清楚做对象组合。

另一方面,通过接口的抽象并不强制实现类继承任何具体的方法实现。因此,它更干净。

0

基于接口的层次结构是一个很好的设计方法,因为它简化了实现:您可以始终实现一个接口,但并不总是可以扩展一个类(例如,最终的类)。或者,另一方面,并​​不总是一个班级的作者希望将其扩展。

所以,你高度关注在类上使用接口,因为这样你可以接受更多的实现。例如:

使用类:

class Component 
{ 
    AbstractList c; 
    Component (AbstractList c){...} 
} 

... Component会接受的ArrayList或载体。

相反,使用接口:

class Component 
{ 
    List c; 
    Component (List c){...} 
} 

...Component将能够接受ArrayList,Vector,CopyOnWriteArrayList ...