Mixin
Als Mixin wird in der objektorientierten Programmierung ein zusammengehöriges, mehrfach verwendbares Bündel von Funktionalität bezeichnet, das zu einer Klasse hinzugefügt werden kann. Von manchen Programmiersprachen werden Mixins direkt unterstützt, beispielsweise von Ruby, Scala, Tool Command Language oder Go. In anderen Sprachen wird dieses Entwurfsmuster abhängig von den Möglichkeiten der jeweiligen Programmiersprache beispielsweise mittels Mixin-Klassen in Verbindung mit Mehrfachvererbung oder, wie z. B. in JavaScript,<ref>Die vielen Talente von JavaScript Rollen-orientierte Programmieransätze wie Traits und Mixins verallgemeinern zu können, 5. Juni 2014.</ref> mittels generischer Programmierung umgesetzt.
Im Unterschied zu Schnittstellen (interface), wie sie beispielsweise in Java und C# üblich sind, enthält ein Mixin aber typischerweise bereits Funktionalität, die verwendet werden kann.
Ein Trait ist eine besondere Form eines Mixins mit einer flexibleren Integration in Klassen.
Beispiel
Das folgende Beispiel stellt einen Anwendungsfall des Mixin-Entwurfsmusters dar. Es enthält eine Klassenhierarchie, die ein Schachspiel modelliert. In diesem Modell ist es für die Klassen Zugfolge und Spielstellung angebracht, diese persistent machen zu können. Das bedeutet, dass Objekte dieser Klassen in einem nicht-flüchtigen Speichermedium – beispielsweise einer Datenbank – gespeichert und aus diesem wieder rekonstruiert werden können. Für andere Klassen dieses Modells ist die Unterstützung einer Persistenz dagegen nicht sinnvoll.
Das Mixin Persistenz könnte die Methoden StoreInDatabase und RestoreFromDatabase enthalten und mittels dieser ein Objekt der Klassen, bei denen dieses Mixin eingebunden wird, in der Datenbank speichern beziehungsweise aus dieser rekonstruieren.
Mixins und Vererbung
Während in Sprachen wie C++ und Eiffel Mixins als Klassen unter Verwendung von Mehrfachvererbung abgebildet werden, gibt es auch die Sichtweise, eine Mixin-basierte Vererbung als Verallgemeinerung des in klassischen objektorientierten Sprachen wie Smalltalk oder Simula implementierten Vererbungmechanismus zu sehen. Wenn man Vererbung als inkrementellen Mechanismus betrachtet, der eine Basisklasse (B) modifiziert, ist das Ergebnis (E) eine Art Kombination der Basisklasse mit einer Modifikation (M). Dies lässt sich folgendermaßen formulieren:
- <math>E = B \, \triangle \, M = B + M(B)</math>
Bei der Vererbung in konventioneller Form hat die Modifikation (M) keine unabhängige Existenz, sie ist Teil des Ergebnisses (E). Im Gegensatz dazu geht man bei der Mixin-basierenden Vererbung vom Standpunkt aus, dass die Modifikation eine Abstraktion ist, die unabhängig von der Basisklasse (B) und dem Ergebnis ist. Diese Modifikation ist das Mixin, das Symbol <math>\triangle</math> steht für die Mixin Application, also die Anwendung des Mixins.
Programmiersprachen, die Mixins verwenden
In einzelnen Programmiersprachen sind Mixins Teil der Programmiersprache selbst. Beispiele hierfür sind die Programmiersprachen ooRexx, Ruby<ref>Ruby und Mixins: Webseite des Herstellers</ref> und Tool Command Language.<ref>Mixin in TclOO: Webseite des Herstellers</ref> Teilweise kann die Mixin-Funktionalität in anderen Programmiersprachen mit externen Bibliotheken realisiert werden (etwa Java<ref>Beispiel für Java mit CGLIB: Multiple class inheritance in Java made easy</ref>).
Seit C# 8.0 und Java 8 können Schnittstellen Standardimplementierungen haben, wodurch eine Mixin-Funktionalität möglich ist.<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:Bill Wagner|Bill Wagner: }}{{#if:|{{#if:Create mixin types using default interface methods|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Create mixin types using default interface methods}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Create mixin types using default interface methods}}}}|[{{#invoke:URLutil|getNormalized|1=https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Create mixin types using default interface methods}}}}]}}{{#if:| ({{{format}}}{{#if:Microsoft technical documentationMicrosoft2021-09-15{{#if: 2022-04-18 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:en-us|de||{{#if:en-us|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods}}%7C%7C}}}}{{#if:Create mixin types using default interface methods|{{#if:{{#invoke:WLink|isValidLinktext|1=Create mixin types using default interface methods|lines=0}}||}}}}{{#if: Microsoft technical documentation| In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Microsoft technical documentation}}}}{{#if: Microsoft| Microsoft{{#if: 2021-09-15|,|{{#if: 2022-04-18 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 2021-09-15| {{#if:{{#invoke:DateTime|format|2021-09-15|noerror=1}}
|{{#invoke:DateTime|format|2021-09-15|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2021-09-15|class=Zitationswartung}} }}{{#if: |,|{{#if: 2022-04-18 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2022-04-18 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:2021-09-15Microsoft|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:1620384||(?)}}}}}}{{#if: 2022-04-18|;}}}}{{#if: 2022-04-18| {{#if:2021-09-15Microsoft{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2022-04-18 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2022-04-18|class=Zitationswartung}} }} {{#invoke:DateTime|format|2022-04-18|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en-us|de||{{#if:en-us|1}}}}|{{#if:Microsoft technical documentationMicrosoft2021-09-15{{#if: 2022-04-18 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if: | | (}}
}}{{#ifeq:{{#if:en-us|en-us|de}}|de||
{{#invoke:Multilingual|format|en-us|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en-us|en-us|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2021-09-15{{#if: 2022-04-18 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en-us|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods | {{#if: | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods | {{#if:{{#invoke:URLutil|isWebURL|https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods | {{#if:{{#invoke:URLutil|isWebURL|https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods | {{#if: | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods | {{#if:{{#invoke:URLutil|isWebURL|https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods | {{#if:{{#invoke:URLutil|isWebURL|https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/mixins-with-default-interface-methods }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref><ref>https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html</ref>
Eine umfangreiche Liste von Programmiersprachen, die Mixins unterstützen, kann im englischsprachigen Wikipedia-Artikel zu Mixins nachgelesen werden.
Literatur
- Iain D. Craig: Object-Oriented Programming Languages: Interpretation. Springer Verlag, London 2007, ISBN 1-84628-773-1
Weblinks
- Gilad Bracha, William Cook: Mixin-based Inheritance. (PDF; 172 kB)
Einzelnachweise
<references />
- Seiten mit defekten Dateilinks
- Wikipedia:Vorlagenfehler/Parameter:URL
- Wikipedia:Vorlagenfehler/Parameter:Linktext
- Wikipedia:Vorlagenfehler/Parameter:Datum
- Wikipedia:Vorlagenfehler/Vorlage:"
- Wikipedia:Weblink offline fix-attempted
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link/URL fehlt
- Objektorientierte Programmierung