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
ました。
私にとって、参照Bは独自のメソッドを呼び出すため、C#の結果の方が理にかなっています。
C-C-C
代わりに印刷するというJavaデザイナーの決定の背後にある論理は何B-C-C
ですか?つまり、参照BがCでオーバーライドメソッドを使用するのはなぜですか?このアプローチの利点は何ですか?B-C-C
C#と同じようにJavaコードを変更して印刷するにはどうすればよいですか?つまり、Javaが使用する正確な参照のメソッドを呼び出すようにJavaに教えるにはどうすればよいですか?- 印刷するようにC#コードを変更するにはどうすればよい
C-C-C
ですか?つまり、オーバーライドメソッドを呼び出すようにC#に教えるにはどうすればよいですか?