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