在下圖中,AbstractPainter
是一個抽象類,它實現了IPainter
。 ContemporaryPainter
和PastPainter
是擴展AbstractPainter
的類。考慮到這一點,做PastPainter
和AbstractPainter
延伸IPainter
?或者他們只擴展AbstractPainter
?抽象類的繼承
謝謝!
在下圖中,AbstractPainter
是一個抽象類,它實現了IPainter
。 ContemporaryPainter
和PastPainter
是擴展AbstractPainter
的類。考慮到這一點,做PastPainter
和AbstractPainter
延伸IPainter
?或者他們只擴展AbstractPainter
?抽象類的繼承
謝謝!
在Java中,思考它的正確方法是擴展抽象類並實現接口。例如,LinkedList
實現List
接口和AbstractSequentialList
。
它們只延伸AbstractPainter
。他們確實實施了IPainter
。所以你可以做
IPainter painter = new PastPainter();
AbstractPainter otherPainter = new ContemporaryPainter();
它仍然是有效的。
然而,在集合中引用它們的時候,就像
List<? extends IPainter> list = new ...
它仍然使用這個詞「擴展」。儘管如此,你仍然不會稱之爲「擴展界面」。
唯一的「擴展接口」是,如果你做的東西像下面的代碼片段:
public interface IPolymath extends IPainter {
List<String> getOtherProfessions();
}
當一些其他的接口擴展了原有的接口。
謝謝,這是很好的幫助!但是,如果我想實現一個關於泛型類型畫家的通用方法呢?我是否使用
你可以用任何一個做。如果你有其他的'IPainter',並且你也想包含它們,那麼使用'T extends IPainter'。如果你想排除這些,使用'AbstractPainter'。如果你沒有,也沒有其他任何人,那麼這沒關係。 – corsiKa
太棒了,這很清楚。謝謝您的幫助! –
是PastPainter
和ContemporaryPainter
類型爲IPainter
,因爲它們延伸AbstractPainter
,其實現IPainter
。
例如:假設ClassA
要麼實現要麼擴展ClassB
。然後如果ClassC
擴展/實現了ClassA
,則自動ClassC
也是ClassB
的類型。
任何子類都是其超類的類型,也是它的超類繼承的類型。
從語義的角度來看,你的例子中的接口和abtract類是多餘的。抽象類的定義就足夠了。但是,清楚的UML遵守你的問題的答案是,AsbtractPainter不直接實現接口IPainter,而是專門爲你抽象類而不是抽象的類的實例。定義專業課可以替代一般專業課也很重要。
這裏有一個明顯缺乏圖表。 – corsiKa
由於某種原因該圖的圖片沒有顯示:[鏈接](http://i.stack.imgur.com/zGHoE.png) –