c# 这些具有抽象基类的子类实例有什么区别

本文关键字:子类 实例 什么 区别 抽象 基类 | 更新日期: 2023-09-27 17:56:01

我不知道如何正确表达这个问题,但我似乎在 StackOverflow 上找不到类似的问题

假设我有一个抽象基类A和一个子类B

显然我可以通过这两行创建子对象

A child = new B();
B child = new B();

似乎它们支持相同的方法用法。

有什么区别?

c# 这些具有抽象基类的子类实例有什么区别

由于B派生自ABA的,因此你可以将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 .