给定以下客户端代码:
var obj = new Class1();有没有办法修改Class1的构造函数,使其实际上返回一个子类(或其他一些替代实现)?
我希望obj在两种不同的实现中选择一种,这取决于某些条件。显然,我可以改用工厂或DI框架,但如果可能的话,我希望避免更改客户端代码。
我假设答案是否定的,但我想知道是否有一些聪明的方法来实现这一点。
发布于 2010-03-01 03:18:39
您可以将构造函数替换为工厂方法,并根据参数返回您喜欢的任何内容:
public Class2 : Class1 {}
public static Class1 CreateClass1(bool returnDerivedClass)
{
if (returnDerivedClass)
{
return new Class2();
}
else
{
return new Class1();
}
}发布于 2010-03-01 03:12:06
这是不可能的。
巧妙的解决方法包括用static函数替换构造函数,或者(不推荐)在基类周围使用包装器,以及创建不同的包装类。
发布于 2010-03-01 03:33:29
对于这样的事情,您需要查看工厂模式。此外,根据您的需要,我建议您查看减少耦合的一般方法。您对类的构造函数的调用是您在程序中所能拥有的最难的耦合,并且使诸如交换实现之类的事情变得麻烦,正如您自己所发现的那样。
阅读“控制反转”和“依赖注入”,也许这才是你真正想要的。
可以在here中找到一个很好的库。
https://stackoverflow.com/questions/2352259
复制相似问题