2016-07-06 185 views
1

我有一個抽象類叫做MyAbstractClass抽象類抽象方法的部分實現

我具有延伸其5個不同的類:類A,B,..È

我需要在類中添加的方法FOO ()MyAbstractClass但僅A,B和C 應該實現它,而DE將永遠不需要執行它。 (程序流程不會到達那裏)

在Java中實現這種行爲會是一個好的做法嗎?

我應該使用接口嗎?

我應該添加另一層繼承兩個區分他們和添加foo只在中間層?

感謝您的任何建議。

回答

5

我在這裏看到的三種基本方法:

子類什麼都不做,如果該方法被稱爲

在這種情況下,你可以記錄通話或警告,它被稱爲,僅僅別的什麼都別做。

孩子上課不應該執行方法

在這種情況下,你可能會引發UnsupportedOperationException

d和E比[A,B,和C]

如果三個執行類在從d和E不同的方式類似,可考慮將一個父類三種根本不同這本身就是你的超類的孩子。然而,如果所有五個類別代表相似的概念,這可能是沒有意義的。

做出A,B和C

的接口如餘德耀和英子的建議,你可以爲僅A,B和C實現這個特定方法的接口。如果您正在處理超類參考類型,那麼您可以檢查是否obj instanceof MyInterface以確定是否應該運行該方法。

如果您使用的是Java 8+,並且A,B和C的方法在功能上沒有區別,那麼您可以在所有實現類都可以使用的接口中定義default方法。

+3

沒有類似的解決方案,使用只有A,B和C實現的接口(例如「Interface Fooable」),而不管抽象類如何? – yuz

+1

我會添加切換到接口的選項,也許默認實現(如果Java 8或更新,並且它「足夠無狀態」)。 – Eiko

1

我看到兩種方法:的foo在不執行任何操作(空法)父類

  • 化妝默認實現沒有把它抽象。在這種情況下,您可以根據需要重寫派生類中的方法。

  • 創建包含foo的接口並在ABC中實現該接口。在這種情況下,您需要檢查一個對象是否正在實現具有對MyAbstractClass變量中對象的引用的接口,然後才能實際調用foo