Diciamo che Java ha queste classi gerarchiche:Java eredità vs C# eredità
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();
}
}
Questo è il (non vedenti) la duplicazione dello stesso codice 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();
}
}
Quando eseguo il Java codice, ho ottenuto C-C-C
mentre C# restituisce B-C-C
.
Per me risultato C# 's ha più senso, come riferimento B invoca il proprio metodo.
- Qual è la logica dietro la decisione del designer Java di stampare
C-C-C
anzichéB-C-C
? Voglio dire, perché il riferimento B usa il metodo di override in C? Qual è il vantaggio di questo approccio? - Come posso cambiare il codice Java per stampare
B-C-C
proprio come C# fa? Voglio dire, come posso insegnare a java a invocare il metodo dell'esatto riferimento che usa? - Come posso cambiare il codice C# per stampare
C-C-C
? Voglio dire, come posso insegnare a C# a invocare il metodo di override?
Si tratta di un semplice problema di progettazione - Java utilizza la spedizione dinamica di default, mentre C# non lo fa, per ottenere dinamica invio in C# è necessario dichiarare un metodo virtuale e indicare che il metodo prevalente lo sta effettivamente sovrascrivendo. – amit
Le classi D e A non hanno alcuna funzione qui.Puoi ometterli per un campione più breve (più chiaro). –