2012-12-11 212 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,而是專門爲你抽象類而不是抽象的類的實例。定義專業課可以替代一般專業課也很重要。