最近在一次采访中,我被问到这个问题:我有一个抽象类A和B类派生A.一个抽象类有一个创建类B(派生)实例的方法.我知道我们可以做到这一点.我认为这是一个糟糕的设计.但是我无法理解基类如何知道它的派生类来创建派生类的实例.
假设你的意思是:
abstract class A
{
void Foo() { var b = new B(); /* now do something with b */ }
}
class B : A { }
Run Code Online (Sandbox Code Playgroud)
任何代码都可以引用任何成功解析的类型; 如果A可以看到B,那么当然A可以创建一个B,就像任何其他代码可以创建一样B.
它没有做的是说"创建我的具体类型的实例" - B这里只是静态知道."创建我的具体类型的实例"必须通过反射来完成:
var a = (A)Activator.CreateInstance(GetType());
Run Code Online (Sandbox Code Playgroud)
(这将是脆弱的,因为我们不知道实际类型需要有意义地构建)