2012-02-28 143 views
5

我有一組類,其中我的基有一個構造函數,它接受一個配置對象並處理將值傳遞給它的屬性。隱式調用父構造函數

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A {} 
class C : A {} 
class D : B {} 
class E : B {} 

是否有可能隱含從子類調用非默認的基類的構造或者我需要明確實現簽名鏈向上通過構造函數來做到這一點?

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A { public A(ObjType MyObj) : base(MyObj){} } 
class C : A { public A(ObjType MyObj) : base(MyObj){} } 
class D : B { public A(ObjType MyObj) : base(MyObj){} } 
class E : B { public A(ObjType MyObj) : base(MyObj){} } 

如果是這樣的話,豈不是更好,只是在實現基本的方法然後讓我的工廠立即調用創建對象後的方法是什麼?

回答

4

含蓄地?不,構造函數不會被繼承。你的班級可能會明確稱它爲父母的構造函數。但是如果你想讓你的類和父類有相同的構造函數簽名,你必須實現它們。

例如:

public class A 
{ 
    public A(int someNumber) 
    { 
    } 
} 

// This will not compile becase A doesn't have a default constructor and B 
// doesn't inherit A's constructors. 
public class B : A 
{ 
} 

爲了使這項工作你必須明確聲明你想B到有構造函數,並將它們顯式調用的構造函數(除非當然有一個默認的構造函數) 。

public class B : A 
{ 
    public B(int someNumber) : base(someNumber) 
    { 
    } 
} 
+0

這就是我(謙虛)所擔心的。我想我會去輔助方法路線。謝謝! – 2012-02-28 16:27:39

1

不,這不是可以調用非默認的基類的構造隱含,你必須使它明確。

1

你需要明確地在鏈中實現它。此外,重要的是,在您的原始代碼中,您將無法調用new B(),因爲A沒有默認構造函數,而B不會調用A的具有arg的構造函數。

+0

感謝和抱歉,爲簡潔起見省略了默認構造函數。 – 2012-02-28 16:28:59