比方說,Java有這些分級類:Java繼承與C#繼承
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中使用重載方法?這種方法的優點是什麼? - 如何才能像C#那樣更改Java代碼來打印出
B-C-C
?我的意思是,我如何教java來調用它使用的確切引用的方法? - 如何更改C#代碼以打印出
C-C-C
?我的意思是,我如何教C#調用重寫方法?
這是一個簡單的設計問題 - java的默認使用動態分配,而C#不,讓動態在C#中調度你需要聲明一個虛擬的方法,並指出覆蓋的方法確實覆蓋了它。 – amit
D和A類在這裏沒有功能。您可以省略它們以獲得更短(更清晰)的樣本。 –