Warum bevorzugen Windows Forms / Swing-Frameworks die Vererbung anstelle der Komposition?

12

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?

verschlungenes Elysium
quelle
2
In den 15 bis 20 Jahren, in denen es diese APIs gibt, hat sich viel geändert! Rendering-Engines hatten keinen magischen XML-Leim, um Bildschirmobjekte an Instanzen einer beliebigen konkreten Klasse "früher" zu binden;)
1
Der meiste Swing-Code, den ich sehe, verwendet eine Erweiterung nach Komposition. Ich bin nicht sicher, woher Ihr Professor seine Daten bezieht.
Ich selbst habe viel im Netz mit Vererbung statt Komposition gesehen - meistens Tutorials. Aber Windows-Formen werden tatsächlich fast ausschließlich durch Vererbung verwendet!
Elysium verschlungen 25.

Antworten:

7

JComponentstellt eine Menge Funktionalität zur Verfügung . Wenn JComponenteine Schnittstelle und Komponenten mit Komposition implementiert würden, müssten einfache Komponenten Dutzende von Wrappern für einfache Methoden haben, z

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

Es gibt auch einen Effizienzgrund, die Vererbung der Komposition vorzuziehen - das Überschreiben kostet nichts (vorausgesetzt, es wird kein superAnruf getätigt), während das Kompositionieren eine zusätzliche Gebühr kostet INVOKEVIRTUAL. Ich weiß nicht, ob dies das Design von Swing beeinflusst hat, aber es ist ein großes Anliegen für Kollektionsklassen.

Daniel Lubarov
quelle
2

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.

Vincent Ramdhanie
quelle
"Das heißt, ein Formular ist eine Zusammenstellung von Behältern und Kontrollen der mittleren Ebene." Sicher. Normalerweise sehe ich jedoch, dass Leute, die ihr eigenes Fenster erstellen möchten (oder wie auch immer das in Swing heißt), von einer Fensterklasse erben, anstatt Komposition zu verwenden.
Elysium verschlungen 25.
@devoured elysium Das stimmt. Aber um die Form zu schaffen, würden sie Komposition verwenden. Es ist also ein bisschen Vererbung und viel Komposition.
@devoured, ich denke, das ist ein Fall, bei dem die Leute nicht bemerken, dass das von ihnen verwendete Tutorial nicht den bewährten Methoden entspricht, weil es die Kürze begünstigt.
Peter Taylor
1

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.

John Gardner
quelle
Was meinst du mit "alles ist virtuell "?
Jonas
In Java ist jede Methode implizit virtuell (kann überschrieben werden). In C # müssen Sie eine Methode explizit als deklarieren. Um sie virtualzu überschreiben, müssen Sie sie explizit als deklarieren override. 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!)
John Gardner
Beachten Sie, dass Sie eine finalMethode in Java nicht überschreiben können , auch wenn dies bei der Basisklasse selbst nicht der Fall ist final.
Perp
das stimmt @perp. aber in java muss man sich abmühen (final hinzufügen), um virtuell zu verhindern . C # ist das Gegenteil, man muss sich sehr viel Mühe geben, um virtuell zu sein. Und ein sehr kleiner Prozentsatz der Standard-Java-Laufzeit ist als final markiert.
John Gardner
1

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 JTableund sehen JInternalFrame. Es ist ein Maß für die Vererbung durch Design in Swing.

trashgod
quelle
-2

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

Saravanan
quelle
Ich sehe keine Relevanz für das Erstellen neuer WinForms Control-Klassen. Könnten Sie näher darauf eingehen?
Peter Taylor
@ Peter: Dies bezieht sich nicht nur auf Windows Forms-Klassen. Dies kann auch aus unserem Code zutreffen. Sie können eine beliebige vorhandene Klasse erweitern, indem Sie einfach eine statische Klasse hinzufügen und dann eine neue Methode mit dem Argument 1st hinzufügen, damit das Basisobjekt mit ihr verknüpft werden kann. Nachdem Sie den Code kompiliert haben, erhalten Sie die neu hinzugefügte Methode als Methode der Basisklasse. Das sagt die Zusammensetzung. hoffe, ich habe recht ..
Saravanan
1
Ich weiß, was Erweiterungsmethoden sind, und sie sind manchmal recht praktisch, aber diese Frage bezieht sich auf verschiedene Ansätze zum Erstellen neuer Klassen.
Peter Taylor
@ Peter: Dann kann ich nur auf die Verwendung von Teilklassen verweisen, abgesehen davon, dass C # meines Erachtens keine andere bemerkenswerte Funktion hat. Wenn Sie welche kennen, lassen Sie es mich bitte wissen.
Saravanan