abstract class CAbstract
{
private string mParam1;
public CAbstract(string param1)
{
mParam1 = param1;
}
}
class CBase : CAbstract
{
}
對於類CBase,它應該通過提供參數進行初始化,那麼如何禁用CBase類的無參數構造函數?如何在C#中禁用無參數構造函數
abstract class CAbstract
{
private string mParam1;
public CAbstract(string param1)
{
mParam1 = param1;
}
}
class CBase : CAbstract
{
}
對於類CBase,它應該通過提供參數進行初始化,那麼如何禁用CBase類的無參數構造函數?如何在C#中禁用無參數構造函數
如果您在CBase
定義參數的構造函數,有是沒有默認構造函數。你不需要做任何特別的事情。
如果你的意圖是所有的派生類CAbstract
實現一個參數化的構造函數,這是不是你可以(乾淨地)完成的。派生類型可以自由提供自己的成員,包括構造函數重載。
唯一他們的要求是,如果CAbstract
只公開一個參數的構造函數,派生類的構造函數必須直接調用它。
class CDerived : CAbstract
{
public CDerived() : base("some default argument") { }
public CDerived(string arg) : base(arg) { }
}
+ 1用於約束派生類的額外位。這就是爲什麼編寫好的OOP庫很困難。 – user7116 2011-06-08 01:56:45
OP指出不需要缺省構造函數。爲什麼你在你的代碼中顯示默認的構造函數? – 2011-06-08 03:26:03
@Alex,這個問題是不明確的,至少對我來說,因此我的第二和第三段以及附帶的代碼片段。我不能完全說出他想要什麼,但是我的感覺*是他想要的是語言不提供的東西。 – 2011-06-08 03:32:26
要禁用默認構造函數,您需要提供非默認構造函數。
您粘貼的代碼不可編譯。爲了讓編譯,你可以做這樣的事情:
class CBase : CAbstract
{
public CBase(string param1)
: base(param1)
{
}
}
請糾正我,如果我錯了,但我覺得我實現這個代碼,目標:
//only for forbiding the calls of constructors without parameters on derived classes
public class UnconstructableWithoutArguments
{
private UnconstructableWithoutArguments()
{
}
public UnconstructableWithoutArguments(params object[] list)
{
}
}
這不會阻止兒童提供無參數構造函數,它只會強制孩子顯式調用基本參數化構造函數。 – 2011-11-15 03:04:03
的[防止默認構造函數的用法]可能重複(http://stackoverflow.com/questions/2875581/prevent-usage-default-constructor) – 2013-03-19 23:46:59
@Sven也許這個類在某些處理語言處理的應用程序中代表字母「C」:D – AaronLS 2013-10-11 01:33:38