2011-05-11 32 views
5

我在想,如果我有X個不同構造一個抽象的超類的,我希望能夠使用所有這些構造函數在子類中,做我必須寫在子類所有X構造函數和讓他們都叫超級(...)?好像冗餘代碼..傳遞建設超類

一個例子清晰度:

public class SuperClass { 
public SuperClass() { 
... 
} 
public SuperClass(double d) { 
... 
} 
public SuperClass(BigDecimal b) { 
... 
} 
public SuperClass(BigDecimal b, String s) { 
... 
} 
[...] 
} 

我是否需要比:

public class SuperClass { 
public SubClass() { 
super(); 
} 
public SubClass(double d) { 
super(d); 
} 
public SubClass(BigDecimal b) { 
super(b); 
} 
public SuperClass(BigDecimal b, String s) { 
super(b, s); 
} 
[...] 
} 

回答

5

但你必須這樣做,這樣一來。這樣你就可以決定你想在子類中公開什麼。另外一些構造函數可能不適用於子類,因此如果沒有明確地編寫它,默認情況下不起作用。

2

您不需要爲每個基本構造函數的重載提供構造函數。你只需要一個。如果你的基構造函數提供了一個默認的(無參數)構造函數,那麼你甚至不需要自己提供一個構造函數。編譯器會自動爲您的類生成一個默認構造函數,該構造函數會自動調用基類的默認構造函數。

注:沒有必要直接調用super(),因爲它是不帶參數的暗示。它僅在沒有默認構造函數時才需要。

看到許多不同的構造函數以及你不需要它們的事實可能意味着父類太多了。

1

你可以有這樣的代碼:

public class SuperClass { 
public SuperClass() { 
... 
} 
public SuperClass(double d) { 
... 
} 
public SuperClass(BigDecimal b) { 

} 
public SuperClass(BigDecimal b, String s) { 
this(b); 
} 
[...] 
} 

而且具有作爲子類:

public class SubClass extends SuperClass{ 
public SubClass() { 
super(); 
} 
public SubClass(double d) { 
super(d); 
} 

public SuperClass(BigDecimal b, String s) { 
super(b, s); 
} 
[...] 
} 
1

如果你想在這兩個parenr和孩子每一種類型的構造函數,那麼,你需要明確指定它們,但不需要明確地調用super()