一千萬個為什麽

搜索

抽象方法的默認實現

我正在處理一個大型的代碼庫,這些代碼有很多類和很多這些類的抽象方法。我對以下情況下我應該做的事情感興趣。

如果我有一個帶有抽象方法的類Parent-A。只有兩個孩子。如果Child-B實現AbstractMethodA但Child-B不適用。

我是不是該

  1. 從父級中移除抽象關鍵字並使用虛擬或動態?
  2. 提供方法的空白實現。
  3. 提供一個實現,如果調用會引發錯誤。
  4. 忽略警告。

編輯:感謝所有的答案。它證實了我的懷疑,認為這不應該發生。經過進一步調查後發現這些方法根本沒有使用,所以我已經完全刪除了它們。

最佳答案

如果AbstractMethodA不適用於Child-B,則Child-B不應從Parent-A繼承。

或者采取對立的方式,如果Child-B從Parent-A繼承,並且AbstractMethodA不適用於該子級,則它不應該在父級中。

通過在Parent-A中添加一個方法,您說這個方法適用於Parent-A及其所有子項。這就是繼承意味著,如果你使用它來表示不同的東西,那麽你最終會與編譯器產生嚴重的爭議。

[編輯 - 也就是說,如果該方法確實適用,Mladen Prajdic的答案沒問題,但對於涉及的一個或多個類別不應該做任何事情。一種什麽都不做的方法是IMO與不適用的方法不同,但也許我們並不是指“不適用”的同一個事物)

另一種技術是在Child-B中實現這個方法,但是要讓它像總是返回失敗一樣激烈,或者拋出異常等等。它可以工作,但應該被看作是一種簡單而不是簡潔的設計,因為這意味著調用者需要知道他們所擁有的東西,他們被認為是Parent-A真的是 一個孩子B,因此他們不應該調用AbstractMethodA。基本上你已經拋棄了多態,這是OO繼承的主要好處。就我個人而言,我更喜歡這樣做,因為在基類中有一個拋出異常的實現,因為這樣子類就不會“意外”地通過“遺忘”來執行該方法。它必須實現它,如果它實現它不起作用,那麽它明確地這樣做。糟糕的情況應該是嘈雜的。

轉載註明原文: 抽象方法的默認實現