c# 这些具有抽象基类的子类实例有什么区别
本文关键字:子类 实例 什么 区别 抽象 基类 | 更新日期: 2023-09-27 17:56:01
我不知道如何正确表达这个问题,但我似乎在 StackOverflow 上找不到类似的问题
假设我有一个抽象基类A
和一个子类B
。
显然我可以通过这两行创建子对象
A child = new B();
B child = new B();
似乎它们支持相同的方法用法。
有什么区别?
由于B
派生自A
,B
是A
的,因此你可以将B
的实例设置为类型为A
的引用。
也就是说,设置为 A
类型的引用的 B
实例将能够访问 A
的成员,但不能从 B
访问。这是一个向上转换(将引用从多类型转换为较少类型)。
B 可以做 A
能做的所有事情,但 B 可以做更多 - 子类中定义的任何内容都可供 B 使用(但不适用于 A)。
通过将 B 分配给 A 变量,您(暂时)删除了它,现在它只能执行 A 可以执行的操作(直到将其分配回 B 变量)。
在第一种情况下,B
实例会自动向下转换(如 ECMA 标准第 136 页所述)为引用类型 A
。这意味着可用的调用方法将是 A
中找到的方法。请注意,这些可能少于 B
中找到的。但是,所有抽象方法都需要由B
实现。
例如,让B
定义为
class abstract A
{
public abstract void Foo();
}
class B
{
public override void Foo() {}
public void Bar() {}
}
在这里,Bar()
的方法仅在您的第二种情况下可用 - var B = new B ();
请注意,如果您使用 var
关键字,则表达式例如 new B()
将是类型 B
.