2011-10-26 132 views
1

有沒有在C#的方式來調用爺爺的構造?比方說,我有:多級繼承構造

public class A 
{ 
    public A(parameterX x) 
    { 
     doSomething(); 
    } 
} 

public class B : A 
{ 
    public B(parameterX x) : base(x) 
    { 
     doSomethingElse(); 
    } 
} 

然後我有:

public class C : B 
{ 
} 

而且我想在C構造函數調用在構造函數中,我可以使用嗎? 有什麼樣:

public C(parameterX x) : base : base(x) 

或者我如何才能調用在構造函數由C?

謝謝。

+0

爲什麼不能在B的構造函數調用A,所以當C時,一個被調用。 –

回答

4

不能調用祖父母類的構造函數。
但是,你也不需要,因爲基類已經做到了。

當您編寫public C(parameterX x) : base(x)時,它將調用B(x),這將調用A(x)。一般來說,由於你的基類的構造函數總是調用它的基構造函數(你的祖父),所以能夠顯式地調用祖父構造函數是沒有意義的,因爲它最終會構造它兩次。

+0

我知道,但問題是一個比較複雜一點比我寫到這裏時,B構造器帶有類Foo的參數,C的構造函數需要一個參數從類吧。 Foo和酒吧是不同的,但都有D類作爲父母。然後,A類構造函數會使用任何一個參數,因爲它使用了模板。所以我不能通過B,但是A會和我的參數一起工作。 – lander16

+0

不可以。您必須始終調用(直接)基類構造函數。你不能有一個非構造的類。考慮在'B'中添加'protected'構造函數。而且,這聽起來像是一個糟糕的設計;考慮重構它。 – SLaks

+0

我想補充的受保護的構造,設計是不是最好的,我努力融入與那種一劈,將節省我噸工作的現有環境。謝謝! – lander16

1

雖然我真的不明白什麼是你正在嘗試做的,你也許可以想出一個更好的實際設計中,你大概可以達到你需要通過添加B中的另一個構造函數的參數酒吧作爲什麼A,但是它只是簡單地調用A(Bar)構造函數,這樣當你做C(bar):base(bar)時,它會去B然後去A.

+0

我可能會這樣做,我知道這是一個糟糕的設計,只是爲了現在節省大量的工作。 – lander16

+0

您可能正在設置自己以後再做更多的工作。 –