2012-12-11 214 views
0

在下图中,AbstractPainter是一个抽象类,它实现了IPainterContemporaryPainterPastPainter是扩展AbstractPainter的类。考虑到这一点,做PastPainterAbstractPainter延伸IPainter?或者他们只扩展AbstractPainter抽象类的继承

谢谢! Diagram

+0

这里有一个明显缺乏图表。 – corsiKa

+0

由于某种原因该图的图片没有显示:[链接](http://i.stack.imgur.com/zGHoE.png) –

回答

1

在Java中,思考它的正确方法是扩展抽象类并实现接口。例如,LinkedList实现List接口和AbstractSequentialList

2

它们只延伸AbstractPainter。他们确实实施了IPainter。所以你可以做

IPainter painter = new PastPainter(); 
AbstractPainter otherPainter = new ContemporaryPainter(); 

它仍然是有效的。

然而,在集合中引用它们的时候,就像

List<? extends IPainter> list = new ... 

它仍然使用这个词“扩展”。尽管如此,你仍然不会称之为“扩展界面”。

唯一的“扩展接口”是,如果你做的东西像下面的代码片段:

public interface IPolymath extends IPainter { 
    List<String> getOtherProfessions(); 
} 

当一些其他的接口扩展了原有的接口。

+0

谢谢,这是很好的帮助!但是,如果我想实现一个关于泛型类型画家的通用方法呢?我是否使用? –

+1

你可以用任何一个做。如果你有其他的'IPainter',并且你也想包含它们,那么使用'T extends IPainter'。如果你想排除这些,使用'AbstractPainter'。如果你没有,也没有其他任何人,那么这没关系。 – corsiKa

+0

太棒了,这很清楚。谢谢您的帮助! –

1

PastPainterContemporaryPainter类型为IPainter,因为它们延伸AbstractPainter,其实现IPainter

例如:假设ClassA要么实现要么扩展ClassB。然后如果ClassC扩展/实现了ClassA,则自动ClassC也是ClassB的类型。

任何子类都是其超类的类型,也是它的超类继承的类型。

0

从语义的角度来看,你的例子中的接口和abtract类是多余的。抽象类的定义就足够了。但是,清楚的UML遵守你的问题的答案是,AsbtractPainter不直接实现接口IPainter,而是专门为你抽象类而不是抽象的类的实例。定义专业课可以替代一般专业课也很重要。