如何防止C#中的inheritance者调用基础构造函数?

我有一个(写得很差)基类,我想包装在一个代理对象中。 基类类似于以下内容:

public class BaseClass : SomeOtherBase { public BaseClass() {} public BaseClass(int someValue) {} //...more code, not important here } 

而且,我的代理类似于:

 public BaseClassProxy : BaseClass { public BaseClassProxy(bool fakeOut){} } 

如果没有“fakeOut”构造函数,则应该调用基础构造函数。 然而,有了它,我预计它不会被调用。 无论哪种方式,我要么需要一种方法来不调用任何基类构造函数,或者有其他方式来有效地代理这个(邪恶的)类。

如果未在基类中显式调用任何构造函数,则将隐式调用无参数构造函数。 没有办法绕过它,你不能在没有调用构造函数的情况下实例化一个类。

有一种方法可以在不调用任何实例构造函数的情况下创建对象。

在继续之前,请确保您想要这样做。 99%的时间这是错误的解决方案。

这是你如何做到的:

 FormatterServices.GetUninitializedObject(typeof(MyClass)); 

调用它来代替对象的构造函数。 它将创建并返回一个实例,而无需调用任何构造函数或字段初始值设定项。

在WCF中反序列化对象时,它使用此方法创建对象。 发生这种情况时,不会运行构造函数甚至字段初始值设定项。

必须至少调用1个ctor。 我看到的唯一方法是遏制。 将类放在内部或引用其他类。

如果你想要的是调用两个基类构造函数中的任何一个,那么就无法做到这一点。

C#类构造函数必须调用基类构造函数。 如果你没有明确地调用一个, 则暗示了base() 。 在您的示例中,如果您未指定要调用的基类构造函数,则它与以下内容相同:

 public BaseClassProxy : BaseClass { public BaseClassProxy() : base() { } } 

如果您更喜欢使用其他基类构造函数,则可以使用:

 public BaseClassProxy : BaseClass { public BaseClassProxy() : base(someIntValue) { } } 

无论哪种方式,两者中的一个被明确或隐含地调用。

我不相信你可以绕过调用构造函数。 但你可以这样做:

 public class BaseClass : SomeOtherBase { public BaseClass() {} protected virtual void Setup() { } } public BaseClassProxy : BaseClass { bool _fakeOut; protected BaseClassProxy(bool fakeOut) { _fakeOut = fakeOut; Setup(); } public override void Setup() { if(_fakeOut) { base.Setup(); } //Your other constructor code } } 

当你创建一个BaseClassProxy对象时,它需要创建它的基类的实例,所以你需要调用基类构造函数,你可以选择要调用的对象,如:

 public BaseClassProxy (bool fakeOut) : base (10) {} 

调用第二个构造函数而不是第一个构造函数

我担心不是基本调用构造函数不是选项。

我最终做了这样的事情:

 public class BaseClassProxy : BaseClass { public BaseClass BaseClass { get; private set; } public virtual int MethodINeedToOverride(){} public virtual string PropertyINeedToOverride() { get; protected set; } } 

这让我了解了基类的一些不良做法。

建设者本质上是公共的。 不要使用构造函数并使用另一个构造函数并将其设置为private.so您将创建一个没有参数的实例并调用该函数来构造您的对象实例。

好吧,这是一个丑陋的解决方案,一个类inheritance另一个类的构造函数的问题,我不想让它们中的一些工作。 我希望避免在我的课堂上使用它,但这里是:

这是我的类构造函数:

 public MyClass(); { throw new Exception("Error: Must call constructor with parameters."); } 

好了,现在你被警告说它很难看。 请不要抱怨!

我想从我的主构造函数中强制至少使用最小参数,而不允许inheritance的基本构造函数没有参数。

我也相信如果你创建一个构造函数并且不在它之后放置:base()它将不会调用基类构造函数。 如果为基类中的所有类创建构造函数,并在主类中为它们提供相同的精确参数,那么它将不会通过。 但是如果基类中有很多构造函数,这可能会很乏味!