Pourquoi Java et C # diffèrent-ils en oups?

1) Pourquoi les codes suivants diffèrent-ils?

C #:

class Base { public void foo() { System.Console.WriteLine("base"); } } class Derived : Base { static void Main(ssortingng[] args) { Base b = new Base(); b.foo(); b = new Derived(); b.foo(); } public new void foo() { System.Console.WriteLine("derived"); } } 

Java:

 class Base { public void foo() { System.out.println("Base"); } } class Derived extends Base { public void foo() { System.out.println("Derived"); } public static void main(Ssortingng []s) { Base b = new Base(); b.foo(); b = new Derived(); b.foo(); } } 

2) Lors de la migration d’une langue à une autre, quels sont les éléments nécessaires pour une transition en douceur?

La raison en est qu’en Java, les méthodes sont virtual par défaut. En C #, les méthodes virtuelles doivent être explicitement marquées comme telles.
Le code C # suivant est équivalent au code Java – notez l’utilisation de virtual dans la classe de base et le override dans la classe dérivée:

 class Base { public virtual void foo() { System.Console.WriteLine("base"); } } class Derived : Base { static void Main(ssortingng[] args) { Base b = new Base(); b.foo(); b = new Derived(); b.foo(); } public override void foo() { System.Console.WriteLine("derived"); } } 

Le code C # que vous avez posté masque la méthode foo dans la classe Derived . C’est quelque chose que vous ne voulez normalement pas faire, car cela causera des problèmes d’inheritance.

En utilisant les classes que vous avez publiées, le code suivant générera différentes choses, bien qu’il s’agisse toujours de la même instance:

 Base b = new Derived(); b.foo(); // writes "base" ((Derived)b).foo(); // writes "derived" 

Le code fixe I fourni ci-dessus produira un résultat “dérivé” dans les deux cas.

Le code C # sera compilé avec des avertissements, puisque vous y cachez des méthodes.

En Java, les méthodes de classe sont toujours virtuelles, alors qu’en C # elles ne le sont pas et vous devez les marquer explicitement comme ‘virtuelles’.

En C #, vous devrez faire ceci:

 public class Base { public virtual void Foo() { Console.WriteLine ("Base"); } } public class Derived : Base { public override void Foo() { Console.WriteLine ("Derived."); } }