Mix In
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
MixIn-Klassen sind ein Mittel der GenerischeProgrammierung, bei dem bestimmte generell brauchbare Funktionalitäten in Klassen zusammen gefasst werden, die dann mit Hilfe von MehrfachVererbung bei Bedarf zu bestimmten Klassen hinzu gefügt werden. MixIns sind damit eine Art Zwitter aus C++-Templates und Java-Interfaces und verwandt mit Traits. Einerseits wird ein Interface per MehrfachVererbung eingebunden wie bei Java, andererseits wird eine Implementation bereitgestellt, wie bei Templates.
Ein konkretes Beispiel für die Verwendung dieses EntwurfsMuster
findet sich z.B. in der StandardBibliothek? der SprachePython
im Modul SocketServer?. Dort gibt es die Möglichkeit die
Klassen TCPServer und UDPServer jeweils durch die Klassen
ForkingMixin? und ThreadingMixin? zu erweitern.
Siehe:
Programmiersprachen mit Mixins | |
Diskussion | |
Das Mixin - EntwurfsMuster beruht auf dem Grundgedanken, dass eine Basisklasse durch wählbare/kombinierbare zusätzliche Features zu einer abgeleiteten Klasse angereichert wird, ähnlich wie man aus einer Speisekarte ein komplettes Menü aus einem einfachen Basismenü durch Auswählen verschiedener Beilagen, Vor- und Nachspeisen zusammenstellen kann.
Die Beilagen, Vor- und Nachspeisen sind keine eigenständigen Menüs (und können vielleicht auch gar nicht separat bestellt werden). Oder objektorientiert: Die "eingemischten" (mix-in) Zusatz-Features sind entweder überhaupt keine Klassen, oder sie sind nicht für das Instanzieren eigenständiger Objekte gedacht. (Anmerkung: In SpracheLava würde man solche Klassen als non-creatable deklarieren. Abstrakte Methoden können nur in non-creatable Klassen deklariert werden, aber non-creatable Klassen müssen keine abstrakten Methoden enthalten.)
Mixins können in konkreten Programmiersprachen, je nach deren Eigenschaften, auf verschiedene Arten realisiert werden:
- Wenn die Sprache dynamisches Kreieren von Methoden und Attributen erlaubt, so ist dies in diesen Sprachen das Mittel der Wahl, solche variablen Zusatz-Features einzumischen.
- Wenn die Sprache MehrfachVererbung unterstützt (z.B. C++ oder SpracheLava), kann man eine abgeleitete Klasse aus einer allgemeinen Basisklasse und mehreren wählbaren, nicht für selbständiges Instanzieren gedachten Beilagen-Klassen durch MehrfachVererbung aufbauen.
- Wenn die Sprache variable Parameter-Klassen als Basisklassen erlaubt (wie C++ - Templates oder in SpracheLava: virtuelle Basisklassen), kann man abgeleitete Klassen aus nicht oder nicht genau festgelegten Basisklassen ableiten. Die wählbaren Zusatzfunktionen werden dann durch Wahl einer konkreten Basisklasse anstelle des Basisklassen-Parameters bestimmt.
- SpracheJava verfügt über keines dieser Features. Auf der folgenden Webseite wird gezeigt, wie man dennoch die Wirkung von MehrfachVererbung für Klassen (wenn auch etwas trickreich und mühsam) simulieren kann (Java unterstützt MV nur für Interfaces), und wie man damit MixIn's realisieren kann, nämlich indem man 1. in der abgeleiteten Klasse ein Member-Objekt vom Typ der einzumischenden Klasse, statt einer entsprechenden Basisklasse, vorsieht, 2. von dem Java-Feature Gebrauch macht, dass eine Klasse mehrere Interfaces implementieren kann und 3. in der abgeleiteten Klasse die Methoden der einzumischenden Klasse durch einfaches Delegieren an das erwähnte Mixin-Member-Objekt erneut implementiert:
Eine gute allgemeine Diskussion von MehrfachVererbung und MixIn's findet man in
Eine mehr plastisch/anschauliche Darstellung liefert
Eine Differenzierung verschiedener MixIn-Begriffe gibt Yannis Smaragdakis in einem Artikel, den man von
herunterladen kann. Der dort primär betrachtete MixIn-Begriff entspricht dem 3. Fall der obigen Aufzählung. Prototypisches Beispiel aus diesem Artikel, mit C++ - Klassen-Templates:
template <class Super>
class Mixin : public Super {
... /* mixin body */
};
Die verschiedenen Autoren unterscheiden sich darin, ob sie die einzumischenden Zusätze, oder aber die abgeleitete Klasse als Mixins bezeichnen.
--KlausGünther
KategorieOop KategorieProgrammierSprachenKonzepte
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 2. Juni 2009 14:46 (diff))