2012-04-02 57 views
5

繼承基本上,我有:java的子類:多個構造從抽象的超

public abstract class AbstractClass { 
    public AbstractClass(Type arg0, Type arg1, Type arg2) { 
     // do some stuff with all those args 
    } 

    public AbstractClass(Type onlyOneArg) { 
     // do different stuffs with this different arg. 
    } 

    protected someMethods() { /* ... */ } 
} 

而且我在子類中的幾個問題:

  • 首先,我要-in大部分案例 - 無用地重寫構造函數。不是非常煩人,只是有點骯髒的眼睛。
  • 而且,更重要的是,我不是被迫執行這兩個構造函數(雖然都在程序中使用)。我目前的子類的

例子:

public class MyClass extends AbstractClass { 
    public MyClass(Type arg0, Type arg1, Type arg2) { 
     super(arg0, arg1, arg2); 
    } 

    public MyClass(Type onlyOneArg) { 
     super(onlyOneArg); 
    } 
} 

而且

  • 我必須能夠寫一些特定的代碼在子類的構造函數,如果我想要的。
  • 我有太多的共享代碼,我想保留在抽象類中。

我可以做些什麼嗎? 有沒有我不瞭解Java的東西?或者我的設計不好?要麼.. ?

+1

不知道問題是什麼。你想被迫實現所有的超類構造函數嗎?你所說的要求是什麼,你似乎無法做到? – 2012-04-02 03:45:32

+0

我很樂意重新提出這個問題,但我不太確定如何..我的意思是我想確保在每個AbstractClass的子類中都有構造函數可用。在程序中,我在不知道確切類型的情況下使用兩個構造函數實例化。我只知道該對象將是一個'AbstractClass'子類。所以我必須確定我總是可以使用這兩個構造函數。這更容易理解嗎?...... Sry,很難用英語表達我的想法! – user978548 2012-04-02 03:54:10

+0

除此之外,我還想知道是否有可能以某種方式讓java自動使用'AbstractClass'構造函數,如果它沒有在子類中定義的話,但那不是我主要關心的。 – user978548 2012-04-02 03:56:54

回答

1

子類必須調用超類構造函數中的一個(或者兩者都有,如果您重新定義了這兩個例子)但是你不能強迫它用超類的相同簽名重新定義構造函數。

保證父類的構造函數是的唯一方法稱爲是擁有超只有一個構造函數。

我認爲你應該想辦法重新設計你的超類(也許創建2類)只有一個構造函數,如果你想要它總是被調用。但是,如果想要在子類中存在特定的構造函數,則應該隔離工廠中的「構造」關注點;您可以在其中爲每個子類設置特殊的工廠類。您的工廠將實現此接口:

interface AbstractClassFactory { 
    AbstractClass create(Type arg0, Type arg1, Type arg2); 
    AbstractClass create(Type onlyOneArg); 
} 
+0

只是有點相關的問題: 我剛剛在Eclipse中進行了測試,看到我可以將工廠接口嵌套在抽象類中,並且每個子類工廠嵌套在它們各自類中的嵌套類沒有問題。 這是一個不好的做法? – user978548 2012-04-02 04:18:54

+0

@ user978548:不一定,它可能會混淆你的用戶。另外,你的嵌套工廠接口和類應該是['static'](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)。 – 2012-04-02 10:30:38

0

構造函數不在Java中繼承。有時候這可能會令人討厭,但它就是這樣。 我不明白,爲什麼你想要每個子類都實現這兩個構造函數。你寫「在程序中,我用兩個構造函數實例化,而不知道確切的類型」。你是什​​麼意思?你不能實例化一個抽象類,你需要知道你用「new」實例化的具體類型。如果你使用反射,你可以在運行時檢查可用的構造函數。

+0

我正在使用反射,但是需要不同的構造函數與最終用戶的使用有關。但是我將使用工廠而不是構造函數。 – user978548 2012-04-02 19:49:26