Heute sagte ein Professor von mir, dass er es seltsam fand, dass Swing, obwohl die Philosophie von SWT darin besteht, eigene Kontrollen durch Kompositionen vorzunehmen, die Vererbung zu bevorzugen scheint.
Ich habe fast keinen Kontakt mit beiden Frameworks, aber von dem, woran ich mich erinnere, erweitert man in C # Windows Forms normalerweise Steuerelemente, genau wie bei Swing.
Da die Leute im Allgemeinen eher Komposition als Vererbung bevorzugen, warum bevorzugten Swing / Windows Forms-Benutzer Kompositionen nicht anstelle von Vererbung?
Antworten:
JComponent
stellt eine Menge Funktionalität zur Verfügung . WennJComponent
eine Schnittstelle und Komponenten mit Komposition implementiert würden, müssten einfache Komponenten Dutzende von Wrappern für einfache Methoden haben, zEs gibt auch einen Effizienzgrund, die Vererbung der Komposition vorzuziehen - das Überschreiben kostet nichts (vorausgesetzt, es wird kein
super
Anruf getätigt), während das Kompositionieren eine zusätzliche Gebühr kostetINVOKEVIRTUAL
. Ich weiß nicht, ob dies das Design von Swing beeinflusst hat, aber es ist ein großes Anliegen für Kollektionsklassen.quelle
Das Swing Framework wurde tatsächlich gemäß dem Composite Design Pattern entworfen. Zugegeben, es steckt viel Vererbung darin, aber Sie würden normalerweise Ihre eigenen Formulare mithilfe der Komposition erstellen. Das heißt, ein Formular besteht aus Behältern und Steuerelementen der Zwischenebene.
quelle
Mit Java ist es viel einfacher, Vererbung zu verwenden, nur weil alles virtuell ist. Müssen Sie ein "Feature" in JTable / JFrame reparieren? Erweitern Sie es, überschreiben Sie die Problemmethoden und verwenden Sie stattdessen Ihre Tabelle / Ihren Rahmen überall.
Ich denke, bei Dingen wie WPF, bei denen die Datenbindung ein Hauptmerkmal des Designs ist, ist es viel einfacher, Kompositionen zu erstellen, als sie zu vererben.
quelle
virtual
zu überschreiben, müssen Sie sie explizit als deklarierenoverride
. In Java können Sie alles, was Sie sehen, überschreiben und die Sichtbarkeit in einer Unterklasse erhöhen (Sie können geschützte Methoden in einer Unterklasse veröffentlichen!)final
Methode in Java nicht überschreiben können , auch wenn dies bei der Basisklasse selbst nicht der Fall istfinal
.In Effective Java , Punkt 17, erwähnt Bloch, dass eine Klasse, die für die Vererbung entworfen wurde, "die Selbstverwendung überschreibbarer Methoden dokumentieren muss". Ein Kennzeichen dafür ist der Satz dieser Implementierung . Sie werden es in Klassen wie
JTable
und sehenJInternalFrame
. Es ist ein Maß für die Vererbung durch Design in Swing.quelle
Ab C # 3.5 haben wir ein Konzept, das als Erweiterungsmethoden bezeichnet wird und das das Konzept der Komposition anstelle der Vererbung ermöglicht.
In diesem Prozess implementieren wir eine erweiterte Funktionalität für eine vorhandene Klasse, indem wir lediglich eine Erweiterungsklasse hinzufügen, die das neue Feature für die vorhandene Klasse darstellt.
Sie können hier für weitere Details verweisen
quelle