Lassen Sie uns sagen Java diese hierarchischen Klassen hat:Java Vererbung vs. C# Vererbung
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();
}
}
Dies ist (blind) Vervielfältigung des gleichen Code in 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();
}
}
Wenn ich die Java ausführen Code, ich habe C-C-C
, während C# B-C-C
zurückgibt.
Für mich macht C# 's Ergebnis mehr Sinn, da Referenz B seine eigene Methode aufruft.
- Was ist die Logik hinter der Entscheidung des Java Designer
C-C-C
stattB-C-C
zu drucken? Ich meine, warum Referenz B die übergeordnete Methode in C verwendet? Was ist der Vorteil dieses Ansatzes? - Wie kann ich den Java-Code ändern, um
B-C-C
auszudrucken, genau wie C#? Ich meine, wie kann ich Java beibringen, die Methode der genauen Referenz aufzurufen, die es verwendet? - Wie kann ich C# -Code ändern, um
C-C-C
auszudrucken? Ich meine, wie kann ich C# lehren, die übergeordnete Methode aufzurufen?
Es ist ein einfache Design-Problem - Java verwendet dynamischen Versand standardmäßig, während C# nicht, tut dynamisch zu bekommen Versand in C# Sie müssen eine Methode virtuell deklarieren und angeben, dass die überschreibende Methode sie tatsächlich überschreibt. – amit
Die Klassen D und A haben hier keine Funktion.Sie können sie für eine kürzere (klarere) Probe weglassen. –