Java構造函數繼承


Answers

當你從Super繼承時,這就是現實中發生的事情:

public class Son extends Super{

  // If you dont declare a constructor of any type, adefault one will appear.
  public Son(){
    // If you dont call any other constructor in the first line a call to super() will be placed instead.
    super();
  }

}

所以,這就是原因,因為你必須調用你獨特的構造函數,因為“Super”沒有缺省的構造函數。

現在,試圖猜測為什麼Java不支持構造函數繼承,可能是因為構造函數只有在討論具體實例時才有意義,並且當你不知道它是如何定義的時候你不應該創建一個實例(通過多態性)。

Question

我想知道為什麼在java構造函數不被繼承? 你知道你什麼時候有這樣的班級:

public class Super {

  public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
    this.serviceA = serviceA;
    //etc
  } 

}

後來當你從Super繼承時,java會抱怨沒有定義默認的構造函數。 解決方案顯然是這樣的:

public class Son extends Super{

  public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
    super(serviceA,serviceB,serviceC);
  }

}

這個代碼是重複的,而不是乾燥和無用的(恕我直言)...所以再次帶來了問題:

為什麼java不支持構造函數繼承? 不允許這種繼承有什麼好處嗎?




你基本上是繼承了構造函數,你可以在適當的時候調用super函數,只是因為其他人提到的原因,如果它默認發生的話,它會很容易出錯。 編譯器無法推測何時合適,何時不合適。

編譯器的工作是盡可能地提供靈活性,同時降低複雜性和意外副作用的風險。




派生類與其基類不是同一個類,您可能會也可能不會在構建派生類時是否初始化基類的任何成員。 這是程序員不是由編譯器做出的決定。




大衛的回答是正確的。 我想補充一點,你可能會從上帝那裡得到一個跡象,表明你的設計已經搞亂了,而“兒子”不應該是“超級”的子類,但是,Super的實現細節表現得最好通過具有 Son提供的功能,作為各種策略。

編輯:喬恩Skeet的答案是最好的。




因為構造函數是一個實現細節 - 它們不是一個接口/超類的用戶實際上可以調用的東西。 當他們得到一個實例時,它已經被構建了; 反之亦然,在你構造一個對象時,根據定義它沒有當前分配給它的變量。

考慮強制所有子類具有繼承構造函數的意義。 我認為直接傳遞變量比類更明確,“神奇地”擁有一個帶有一定參數的構造函數,因為它是父類。




Links