2011-06-08 46 views
17
abstract class CAbstract 
{ 
    private string mParam1; 
    public CAbstract(string param1) 
    { 
     mParam1 = param1; 
    } 
} 

class CBase : CAbstract 
{ 
} 

對於類CBase,它應該通過提供參數進行初始化,那麼如何禁用CBase類的無參數構造函數?如何在C#中禁用無參數構造函數

+0

的[防止默認構造函數的用法]可能重複(http://stackoverflow.com/questions/2875581/prevent-usage-default-constructor) – 2013-03-19 23:46:59

+0

@Sven也許這個類在某些處理語言處理的應用程序中代表字母「C」:D – AaronLS 2013-10-11 01:33:38

回答

23

如果您在CBase定義參數的構造函數,有是沒有默認構造函數。你不需要做任何特別的事情。

如果你的意圖是所有的派生類CAbstract實現一個參數化的構造函數,這是不是你可以(乾淨地)完成的。派生類型可以自由提供自己的成員,包括構造函數重載。

唯一他們的要求是,如果CAbstract只公開一個參數的構造函數,派生類的構造函數必須直接調用它。

class CDerived : CAbstract 
{ 
    public CDerived() : base("some default argument") { } 
    public CDerived(string arg) : base(arg) { } 
} 
+1

+ 1用於約束派生類的額外位。這就是爲什麼編寫好的OOP庫很困難。 – user7116 2011-06-08 01:56:45

+0

OP指出不需要缺省構造函數。爲什麼你在你的代碼中顯示默認的構造函數? – 2011-06-08 03:26:03

+0

@Alex,這個問題是不明確的,至少對我來說,因此我的第二和第三段以及附帶的代碼片段。我不能完全說出他想要什麼,但是我的感覺*是他想要的是語言不提供的東西。 – 2011-06-08 03:32:26

13

要禁用默認構造函數,您需要提供非默認構造函數。

您粘貼的代碼不可編譯。爲了讓編譯,你可以做這樣的事情:

class CBase : CAbstract 
{ 
    public CBase(string param1) 
     : base(param1) 
    { 
    } 
} 
-3

請糾正我,如果我錯了,但我覺得我實現這個代碼,目標:

//only for forbiding the calls of constructors without parameters on derived classes 
public class UnconstructableWithoutArguments 
{ 
    private UnconstructableWithoutArguments() 
    { 
    } 

    public UnconstructableWithoutArguments(params object[] list) 
    { 
    } 
} 
+3

這不會阻止兒童提供無參數構造函數,它只會強制孩子顯式調用基本參數化構造函數。 – 2011-11-15 03:04:03