2011-07-19 88 views
5

的情況是我要繼承的對象有一個更清潔的構造函數接口:繼承與構造函數參數類在Java中

class BaseClass { 
    public BaseClass(SomeObject object){ 
     ... 
    } 
} 

class SubClass extends BaseClass{ 
    private SubObject subObject = new SubObject(); 
    public SubClass(){ 
     super(new SomeObject(subObject)); // doesn't compile 
    } 
} 

但要做到這一點,我需要在構造函數之前做的東西像例子但不能這樣做,因爲Java不允許這樣做。有沒有辦法解決?我開始覺得,如果你的類被設計爲子類,它應該總是實現默認的構造函數,併爲它需要的值提供setter ...有時,如果你創建一個新的對象直接進入超級構造函數作爲一個參數,但如果你需要一個對你創建的對象的引用,那麼你就會被洗掉。

+1

你得到的編譯錯誤是什麼? –

+0

在調用超類型構造函數之前無法引用子對象 – palto

+0

*顯式調用構造函數時無法引用實例字段subObject * –

回答

4

您需要對其進行更改,以便在superconstructor調用中不引用實例成員。不幸的是,如果你需要「保存」SubObject,它變得棘手。我認爲你必須用構造函數鏈來做:

class SubClass extends BaseClass{ 
    private SubObject subObject; 

    public SubClass() { 
     this(new SubObject()); 
    } 

    private SubClass(SubObject subObject) { 
     super(new SomeObject(subObject)); 
     this.subObject = subObject; 
    } 
} 
0
public SubClass(){ 
    super(new SomeObject(new SubObject())); // this should compile 
} 

現在在你的超類,做這樣的事情:

private final SomeObject foo; 
public BaseClass(SomeObject foo){ 
    this.foo = foo; 
} 
public /* or protected */ SomeObject getFoo(){return this.foo;} 
+0

不能引用子對象的方式 – palto

+1

'super'需要'SomeObject'作爲參數而不是'SubObject' –

+0

沒錯,但是你可以通過訪問器從超類中獲取它,請參閱我的更新 –

0

不完全是一個答案,因爲你將沒有​​,但你可以使用一個工廠。

public BaseClassFactory { 
    public static BaseClass newBaseClass() { 
     // init some object 
     // ... 
     return new BaseClass(someObject); 
    } 
}