Object#CreateInstance 在 .NET 中的误解

本文关键字:误解 NET Object#CreateInstance | 更新日期: 2023-09-27 18:36:00

我知道你不能实例化抽象类,但C#看起来它正在这样做。我想我只是在语法上遇到了一些问题。下面是示例:

public abstract class AClass {
...
}
public class SomeClass:AClass{
...
}
public class SomeOtherClass{
  public static AClass createInstance(string key){
    AClass instance = Object.CreateInstance<SomeClass>();
    return instance;
  }
}

当我打电话给SomeOtherClass.createInstance("key")时,一切正常。但是,如果您仔细观察,它看起来像AClass被实例化。有人可以解释一下这里发生了什么吗?

Object#CreateInstance 在 .NET 中的误解

此代码不是实例化抽象类 - 它是实例化扩展抽象类的类

它相当于

AClass instance = new SomeClass();

赋值有效,因为SomeClassAClass子类。由于继承对"is-a"关系进行建模,因此始终允许将子类的实例分配给类型为超类或接口的变量。

有一个

类型为"引用AClass"的变量,它指的是类型为 SomeClass 的完整对象中的AClass子对象。

抽象类实例只能作为基子对象存在。 此代码不会违反该规则。