Dies sind sehr unterschiedliche Sprachen, insbesondere in diesem Bereich. Nehmen wir an, Sie haben eine Klasse. In diesem Fall machen wir daraus ein Benutzersteuerelement, so etwas wie ein Textfeld. Nennen Sie es UIControl. Jetzt wollen wir das in eine andere Klasse einordnen. Da wir in diesem Fall eine Benutzeroberfläche für unser Beispiel verwenden, nennen wir sie die CleverPanel-Klasse. Unsere CleverPanel-Instanz möchte aus verschiedenen Gründen wissen, was mit ihrer UIControl-Instanz passiert. Wie macht man das?
In C # besteht der grundlegende Ansatz darin, nach verschiedenen Ereignissen zu suchen und Methoden einzurichten, die ausgeführt werden, wenn jedes interessante Ereignis ausgelöst wird. In Java, in dem es an Ereignissen mangelt, besteht die übliche Lösung darin, ein Objekt mit verschiedenen "Ereignis" -Behandlungsmethoden an eine UIControl-Methode zu übergeben:
boolean stillNeedIt = ... ;
uiControl.whenSomethingHappens( new DoSomething() {
public void resized( Rectangle r ) { ... }
public boolean canICloseNow() { return !stillNeedIt; }
public void closed() { ... }
...
} );
Bisher ist der Unterschied zwischen C # und Java nicht tiefgreifend. Wir haben jedoch die DoSomething-Schnittstelle, die in C # nicht benötigt wird. Außerdem enthält diese Schnittstelle möglicherweise viele Methoden, die die meiste Zeit nicht benötigt werden. In C # behandeln wir dieses Ereignis einfach nicht. In Java erstellen wir eine Klasse, die eine Null-Implementierung für alle Schnittstellenmethoden bereitstellt, DoSomethingAdapter. Jetzt ersetzen wir DoSomething durch DoSomethingAdapter und müssen für eine saubere Kompilierung überhaupt keine Methoden schreiben. Am Ende überschreiben wir nur die Methoden, die wir benötigen, damit das Programm richtig funktioniert. Daher benötigen wir eine Schnittstelle und verwenden Vererbung in Java, um das, was wir getan haben, mit Ereignissen in C # abzugleichen.
Dies ist ein Beispiel, keine umfassende Erörterung, aber es enthält die Grundlagen, warum Java im Gegensatz zu C # so viel vererbt.
Warum funktioniert Java so? Flexibilität. Das Objekt wurde übergeben, wenn Something Happens vollständig an CleverPanel übergeben werden konnte. Möglicherweise sollten mehrere CleverPanel-Instanzen an ihre UIControl-ähnlichen Objekte übergeben werden, um irgendwo ein CleverWindow-Objekt zu unterstützen. Oder die UIControl könnte es an eine ihrer Komponenten übergeben.
Anstelle eines Adapters kann es auch eine DoSomething-Implementierung geben, die Tausende von Codezeilen enthält. Wir könnten eine neue Instanz erstellen , dass es passieren. Möglicherweise müssen wir eine Methode überschreiben. Ein häufiger Trick in Java ist, eine große Klasse mit einer Methode wie der folgenden zu haben:
public class BigClass implements DoSomething {
...many long methods...
protected int getDiameter() { return 5; }
}
Dann in CleverlPanel:
uiControl.whenSomethingHappens( new BigClass() {
@Override
public int getDiameter() { return UIPanel.currentDiameter; }
} );
Die Open-Source-Java-Plattform leistet einen großen Beitrag dazu, dass Programmierer mehr tun - sowohl, weil sie dem Beispiel folgen als auch einfach, um es zu nutzen. Ich denke, dass das grundlegende Design der Sprache hinter dem Framework-Design von Sun und hinter dem Einsatz der Techniken durch Java-Programmierer steckt, wenn das Framework nicht verwendet wird.
In Java ist es ganz einfach, eine Klasse im laufenden Betrieb zu erstellen. Die Klasse, anonym oder benannt, muss nur in einem kleinen Codeblock referenziert werden, der tief in einer Methode vergraben ist. Es kann komplett neu erstellt werden oder durch geringfügige Änderungen an einer sehr großen, vorhandenen Klasse. (Und die vorhandene Klasse kann sich auf oberster Ebene in ihrer eigenen Datei befinden oder in einer Klasse auf oberster Ebene verschachtelt sein oder nur innerhalb eines einzelnen Codeblocks definiert sein.) Die neue Klasseninstanz kann vollen Zugriff auf alle Daten des erstellenden Objekts haben. Die neue Instanz kann im gesamten Programm übergeben und verwendet werden und stellt das Objekt dar, von dem sie erstellt wurde.
(Beachten Sie außerdem, dass die Vererbung in großem Umfang hier - wie auch an anderen Stellen in Java - nur zu DRY-Zwecken verwendet wird. Verschiedene Klassen können denselben Code wiederverwenden. Beachten Sie auch die einfache Vererbung in Java, die dies fördert. )
Auch dies ist keine umfassende Diskussion. Ich kratz hier nur an der Oberfläche. Aber ja, es gibt einen verblüffenden Unterschied in der Verwendung der Vererbung zwischen Java und C #. Sie sind in dieser Hinsicht sehr unterschiedliche Sprachen. Es ist nicht deine Einbildung.