我有一个 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()");
}
}
最佳答案
您绝对正确,OnlyB
与 this.OnlyB
相同。这就是问题所在; this
是 A
类型。它甚至不知道 B
存在(也不应该存在)。
父类(super class)没有也不应该知道它们有派生类这一事实根本更不用说它们中有什么方法了。这不是“搜索”的问题;当你的 C
没有定义 OnlyB
时会发生什么?会调用什么方法?
另一方面,子类总是父类(super class)的子类;因此它们调用基类方法是安全的。
关于c# - 为什么当对象是子类类型时,不能从父类(super class)中调用子类中的公共(public)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44834800/