如何防止C#的继承者调用基本构造函数?

时间:2020-03-06 14:59:38  来源:igfitidea点击:

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

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   public BaseClass(int someValue) {}

   //...more code, not important here
}

而且,我的代理类似于:

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

如果没有" fakeOut"构造函数,则将调用基本构造函数。但是,有了它,我希望它不会被调用。无论哪种方式,我或者需要一种不调用任何基类构造函数的方法,或者需要某种其他有效地代理此(邪恶的)类的方法。

解决方案

至少需要调用1个ctor。我看到的唯一解决方法是遏制。将班级放在内部或者引用另一个班级。

如果未在基类中显式调用任何构造函数,则将隐式调用无参数构造函数。没有办法解决,没有调用构造函数就无法实例化类。

我很害怕没有基调用构造函数是不可行的。

当我们创建BaseClassProxy对象时,它需要创建其基类的实例,因此我们需要调用基类的构造函数,可以做的就是选择一个来调用,例如:

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

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

我不相信我们可以绕过调用构造函数。但是我们可以执行以下操作:

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
   }
}

如果我们要的是不调用两个基类构造函数中的任何一个,则无法完成此操作。

Cclass构造函数必须调用基类构造函数。如果未显式调用,则暗含base()。在示例中,如果我们未指定要调用的基类构造函数,则它与以下内容相同:

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

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

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

无论哪种方式,都将显式或者隐式调用两者之一。

我最终做了这样的事情:

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

这使我避免了基类的一些不良做法。

有一种无需调用任何实例构造函数即可创建对象的方法。

在继续之前,请务必确保要以这种方式进行操作。 99%的时间是错误的解决方案。

这是操作方式:

FormatterServices.GetUninitializedObject(typeof(MyClass));

调用它代替对象的构造函数。它将创建并返回一个实例,而无需调用任何构造函数或者字段初始化程序。

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