假设 Java 有这些分层类:
class A
{
}
class B extends A
{
public void m()
{
System.out.println("B\n");
}
}
class C extends B
{
public void m()
{
System.out.println("C\n");
}
}
class D extends C
{
public static void main(String[] args)
{
A a = new D();
// a.m(); // doesn't work
B b = new D();
b.m();
C c = new D();
c.m();
D d = new D();
d.m();
}
}
这是 C# 中相同代码的(盲目)重复:
using System;
class A
{
}
class B : A
{
public void M()
{
Console.WriteLine("B");
}
}
class C : B
{
public void M() // I need to use public new void M() to avoid the warning
{
Console.WriteLine("C");
}
}
class D : C
{
public static void Main(String[] args)
{
A a = new D();
// a.M(); // doesn't work
B b = new D();
b.M();
C c = new D();
c.M();
D d = new D();
d.M();
}
}
当我执行 Java 代码时,我得到了C-C-C
而 C# 返回B-C-C
.
对我来说,C# 的结果更有意义,因为引用 B 调用了它自己的方法。
- Java 设计者决定打印
C-C-C
而不是打印的逻辑是B-C-C
什么?我的意思是,为什么引用 B 使用 C 中的覆盖方法?这种方法有什么好处? - 如何
B-C-C
像 C# 一样更改 Java 代码以打印出来?我的意思是,我怎样才能教 java 调用它使用的确切引用的方法? - 如何更改 C# 代码以打印出来
C-C-C
?我的意思是,我怎样才能教 C# 调用覆盖方法?