c# - 为什么当对象是子类类型时,不能从父类(super class)中调用子类中的公共(public)方法?

标签 c# inheritance

我有一个 B 类,它是 A 类的子类。我创建了一个 B 类型的对象并对其调用 OnlyA(),但在 OnlyA() 内部,对 OnlyB() 的调用导致编译器错误。

根据我的理解,OnlyB()this.OnlyB() 相同,调用的方法应该从对象的类 (B) 中选择,而不是当前正在执行代码的类 (A)。这就是为什么对 Both() 的调用调用 B 中的方法,而不是 A 中的方法。那么为什么它在 A 中搜索 OnlyB() 而不是 B?我怎么知道调用的方法是从对象的类还是当前类中选择的?

class Program
{
    static void Main(string[] args)
    {
        B bRefB = new B();

        bRefB.OnlyA();
    }
}

class A
{
    public void OnlyA()
    {
        Console.WriteLine("In A - OnlyA()");
        OnlyB(); // compiler error
        Both();  // calls the method in B
    }

    public virtual void Both()
    {
        Console.WriteLine("In A - Both()");
    }
}

class B : A
{
    public void OnlyB()
    {
        Console.WriteLine("In B - OnlyB()");
    }

    public override void Both()
    {
        Console.WriteLine("In B - Both()");
    }
}

最佳答案

您绝对正确,OnlyBthis.OnlyB 相同。这就是问题所在; thisA 类型。它甚至不知道 B 存在(也不应该存在)。

父类(super class)没有也不应该知道它们有派生类这一事实根本更不用说它们中有什么方法了。这不是“搜索”的问题;当你的 C 没有定义 OnlyB 时会发生什么?会调用什么方法?

另一方面,子类总是父类(super class)的子类;因此它们调用基类方法是安全的。

关于c# - 为什么当对象是子类类型时,不能从父类(super class)中调用子类中的公共(public)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44834800/

相关文章:

c# - (有时)词典中不存在给定的键

c++ - Makefiles - 继承类和内部类

c++ - 从基类构造函数构造派生类对象

java - 将继承参数从父类(super class)更改为子类

c# - Web 浏览器附加 header

c# - 动态更新事件

c# - 在使用早期绑定(bind)实体 CRM SDK 2015 的 UpdateObject 时在 SaveChanges 上出错

c# - 如何在文本区设置空值

UILabel继承的Swift自定义UIView

java - 在不移动迭代器的情况下从链表返回值