2009-09-06 122 views
14

我想有與被所有子類自動繼承的參數的構造方法,但Java不會讓我做這件事的Java:繼承構造

class A { 
    public A(int x) { 
    // Shared code here 
    } 
} 

class B extends A { 
    // Implicit (int x) constructor from A 
} 

class C extends A { 
    // Implicit (int x) constructor from A 
} 

我不希望有爲每個孩子班級編寫B(int x),C(int x)等。有沒有更好的方法來解決這個問題?

解決方案#1。製作一個init()方法,可以在構造函數之後調用它。儘管對於我的特定設計,我仍然希望用戶在構造函數中指定在編譯時驗證的某些參數(例如,不通過varargs/reflection)。

回答

26

你不能。如果你想在你的基類中有一個參數化的構造函數 - 而且沒有無參數的構造函數 - 你將不得不在每個後代類中定義一個構造函數(並且調用構造函數super())。

+14

真是無可奈何...... – machete 2014-02-15 13:23:45

+1

不管我多次提醒這件事,它仍然令人不安。把所有這些努力都放在做綜合基礎班上,那麼孩子們最終會成爲50個班級,因爲我必須改寫這麼多的樣板 – 2017-01-04 20:01:56

2

你不能在java中。如果沒有在方法中顯式聲明方法參數,則不能提供方法參數。這樣做可能不是最好的想法,它可能會導致代碼混亂和過於複雜的事情。不得不輸入幾個額外字符的替代方法不是,即不好。 :d

4

Inheritance

內容:一個子類從其超類繼承所有 成員(字段,方法和嵌套 類)。 構造函數不是成員,因此它們 不會被子類繼承,但是 超類的構造函數可以從子類調用 。

12

其他答覆是正確的,Java不會讓你繼承構造函數。但IDE可以用來幫助減輕爲所有課程創建這些負擔的巨大負擔。

在Eclipse中,進入「Source」菜單並選擇「從超類生成構造函數...」。在使用對話框創建新班級時,您也可以選擇此選項作爲選項。

+5

嗯......一個人的「巨大負擔」是另一個人的微不足道的任務。 – 2009-09-06 09:47:41

+0

在IntelliJ IDEA中,您可以按Alt + Insert並選擇構造函數。這將彈出一個菜單,您可以選擇一個或多個父構造函數來實現,並且這些將自動創建。 – Patrick 2013-08-06 21:26:15

0

如果您有一個要分配的默認值,您可以在調用參數化構造函數的基類中創建一個空構造函數。

這將刪除需要子類來調用參數化的構造函數。