2011-06-08 186 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

相关问题