当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何防止C#中的继承者调用基础构造函数?》经验,为你挑选了4个好方法。

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

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

   public BaseClass(int someValue) {}

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

而且,我的代理类似于:

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

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



1> Neil..:

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

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

这是你如何做到的:

FormatterServices.GetUninitializedObject(typeof(MyClass));

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

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


那是疯子.我的整个世界颠倒了!
这对于单元测试来说绝对是绝佳的!
韦尔普,这解决了我的问题!在继承的类上运行单元测试时,尝试避免父对象的构造函数的DB调用.
FormatterServices.GetUninitializedObject(typeof运算(MyClass的)); 但是仍会调用静态构造函数.

2> 小智..:

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


实际上,如果您在下面阅读我的评论,则有一种方法,尽管在大多数情况下我不建议这样做。
这个答案是完全错误的。尤其是根据其他答案。

3> mattlant..:

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



4> Lucas..:

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

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

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

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

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

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

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有