Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在抽象类中的方法创建其派生类的实例的幕后会发生什么?_C#_Inheritance - Fatal编程技术网

C# 在抽象类中的方法创建其派生类的实例的幕后会发生什么?

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,那么当然

最近在一次采访中,我被问到这样一个问题:我有一个抽象类A和类B派生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。这就解决了我的困惑。谢谢你,马克。这就解决了我的困惑。