Предположим, что 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();
}
}
Это (слепое) дублирование того же кода в С#:
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
, тогда как С# возвращает B-C-C
.
Для меня результат С# имеет больше смысла, так как ссылка B вызывает свой собственный метод.
- Какова логика решения Java-дизайнера для печати
C-C-C
вместоB-C-C
? Я имею в виду, почему ссылка B использует переопределяющий метод в C? Какое преимущество этого подхода? - Как я могу изменить код Java для печати
B-C-C
, как это делает С#? Я имею в виду, как я могу научить java вызывать метод точной ссылки, которую он использует? - Как мне изменить код С# для печати
C-C-C
? Я имею в виду, как я могу научить С# вызывать метод переопределения?