C# 在抽象类中的方法创建其派生类的实例的幕后会发生什么?
最近在一次采访中,我被问到这样一个问题:我有一个抽象类A和类B派生A。一个抽象类有一个创建类B(派生)实例的方法。我知道我们能做到。我认为这是一个糟糕的设计。但我无法理解基类如何知道其派生类以创建派生类的实例。假设您的意思是:C# 在抽象类中的方法创建其派生类的实例的幕后会发生什么?,c#,inheritance,C#,Inheritance,最近在一次采访中,我被问到这样一个问题:我有一个抽象类A和类B派生A。一个抽象类有一个创建类B(派生)实例的方法。我知道我们能做到。我认为这是一个糟糕的设计。但我无法理解基类如何知道其派生类以创建派生类的实例。假设您的意思是: abstract class A { void Foo() { var b = new B(); /* now do something with b */ } } class B : A { } 任何代码都可以引用成功解析的任何类型;如果A可以看到B,那么当然
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());
(这将是脆弱的,因为我们不知道实际类型需要有意义地构造)假设您的意思是:
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());
(这将是脆弱的,因为我们不知道实际的类型需要有意义地构造)你的意思是像A有一个像
public static B CreateB(){return new B();}
?我不确定这篇文章中的问题是什么。给出稍微误导性的提示是一个相当标准的采访技巧。它测试候选者完成一个不完美的功能规范的能力。如果谈论工厂模式,你可能会取得成功。你的意思是像A有一个像public static B CreateB(){return new B();}这样的方法
?我不确定这篇文章中的问题是什么。给出稍微有误导性的提示是一种相当标准的面试技巧。它测试应试者完成不完美功能规范的能力。如果你谈论工厂模式,你可能会获得A。谢谢Marc。这就解决了我的困惑。谢谢你,马克。这就解决了我的困惑。