cas*_*ora 23 c# oop proxy inheritance constructor
我有一个(写得很差)基类,我想包装在一个代理对象中.基类类似于以下内容:
public class BaseClass : SomeOtherBase
{
public BaseClass() {}
public BaseClass(int someValue) {}
//...more code, not important here
}
Run Code Online (Sandbox Code Playgroud)
而且,我的代理类似于:
public BaseClassProxy : BaseClass
{
public BaseClassProxy(bool fakeOut){}
}
Run Code Online (Sandbox Code Playgroud)
如果没有"fakeOut"构造函数,则应该调用基本构造函数.然而,有了它,我预计它不会被调用.无论哪种方式,我要么需要一种方法来不调用任何基类构造函数,或者其他一些方法来有效地代理这个(邪恶的)类.
Nei*_*eil 58
有一种方法可以在不调用任何实例构造函数的情况下创建对象.
在继续之前,请确保您想要这样做.99%的时间这是错误的解决方案.
这是你如何做到的:
FormatterServices.GetUninitializedObject(typeof(MyClass));
Run Code Online (Sandbox Code Playgroud)
调用它来代替对象的构造函数.它将创建并返回一个实例,而无需调用任何构造函数或字段初始值设定项.
在WCF中反序列化对象时,它使用此方法创建对象.发生这种情况时,不会运行构造函数甚至字段初始值设定项.
小智 21
如果未在基类中显式调用任何构造函数,则将隐式调用无参数构造函数.没有办法绕过它,你不能在没有调用构造函数的情况下实例化一个类.
我不相信你可以绕过调用构造函数。但你可以这样做:
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
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想要的是不调用两个基类构造函数中的任何一个,那么就无法做到这一点.
C#类构造函数必须调用基类构造函数.如果你没有明确地调用一个,则暗示了base().在您的示例中,如果您未指定要调用的基类构造函数,则它与以下内容相同:
public BaseClassProxy : BaseClass
{
public BaseClassProxy() : base() { }
}
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢使用其他基类构造函数,则可以使用:
public BaseClassProxy : BaseClass
{
public BaseClassProxy() : base(someIntValue) { }
}
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,两者中的一个将被明确或隐含地调用.