Mixin

Auf objektorientierten Programmiersprachen ist ein mixin eine Klasse, die eine bestimmte Funktionalität zur Verfügung stellt, die zu erben oder gerade durch eine Unterklasse, während nicht beabsichtigt für instantiation (die Generation von Gegenständen dieser Klasse) wiederzuverwenden ist. Mixins sind mit abstrakten Grundklassen synonymisch. Das Übernehmen von einem mixin ist nicht eine Form der Spezialisierung, aber ist eher ein Mittel der sich versammelnden Funktionalität. Eine Klasse oder Gegenstand können am meisten "erben", oder ganze seine Funktionalität von einem oder mehr mixins deshalb kann von mixins als ein Mechanismus der Mehrfachvererbung gedacht werden.

Mixins ist zuerst im objektorientierten Geschmack-System der Symbolik erschienen (entwickelt von Howard Cannon), der eine Annäherung an die im Lispeln-Maschinenlispeln verwendete Gegenstand-Orientierung war. Der Name wurde durch das Eis-Wohnzimmer von Steve in Somerville, Massachusetts begeistert: Der Eis-Geschäftseigentümer hat einen grundlegenden Geschmack nach Eis (Vanille, Schokolade, usw.) angeboten und hat eine Kombination von Extrasachen (Nüsse, Plätzchen, Blödsinn, usw.) gemischt und hat den Artikel eine "Mischung - in", sein eigener Markenbegriff zurzeit genannt.

Mixins fördern Codewiedergebrauch und vermeiden wohl bekannte mit der Mehrfachvererbung vereinigte Pathologien. Jedoch führen mixins ihren eigenen Satz von Kompromissen ein.

Ein mixin kann auch als eine Schnittstelle mit durchgeführten Methoden angesehen werden. Wenn eine Klasse einen mixin einschließt, führt die Klasse die Schnittstelle durch und schließt ein, aber nicht, erbt Attribute ganzen mixin (Felder, Eigenschaften) und Methoden. Sie werden ein Teil der Klasse während der Kompilation. Mixins brauchen keine Schnittstelle durchzuführen. Der Vorteil, eine Schnittstelle durchzuführen, besteht darin, dass Beispiele der Klasse als Rahmen zu Methoden passiert werden können, die diese Schnittstelle verlangen.

Ein mixin kann Definition und Schwergängigkeit von Methoden bis zur Durchlaufzeit aufschieben, obwohl Attribute und instantiation Rahmen noch während der Übersetzung definiert werden. Das unterscheidet sich von der am meisten weit verwendeten Annäherung, die auf der Programmiersprache Simula hervorgebracht hat, alle Attribute, Methoden und Initialisierung während der Übersetzung zu definieren.

Definition und Durchführung

In Simula werden Klassen in einem Block definiert, in dem Attribute, Methoden und Klasseninitialisierung alle zusammen definiert werden; so werden alle Methoden, die auf einer Klasse angerufen werden können, zusammen definiert, und die Definition der Klasse ist abgeschlossen.

Mit mixins definiert die Klassendefinition nur die Attribute und mit dieser Klasse vereinigten Rahmen; Methoden werden verlassen, anderswohin, als in Geschmäcken und CLOS definiert zu werden, und werden in "allgemeinen Funktionen" organisiert. Diese allgemeinen Funktionen sind Funktionen, die in vielfachen Fällen (Methoden) durch die Typ-Absendung und Methode-Kombinationen definiert werden.

CLOS und Geschmäcke erlauben mixin Methoden, Verhalten zu vorhandenen Methoden hinzuzufügen:: vorher und: nach Dämonen, Unwahrheiten und Streifbändern in Geschmäcken. CLOS hat beigetragen: Um Methoden und die Fähigkeit, shadowed Methoden über die folgende Methode des ANRUFS zu nennen. Also, zum Beispiel kann ein stream-lock-mixin Blockierung um vorhandene Methoden einer Strom-Klasse hinzufügen. In Geschmäcken würde man einem Streifband oder einer Unwahrheit schreiben, und in CLOS würde man verwenden: um die Methode. Sowohl CLOS als auch Geschmäcke erlauben den geschätzten Wiedergebrauch über Methode-Kombinationen.: vorher: danach und: Um Methoden sind eine Eigenschaft der Standardmethode-Kombination. Andere Methode-Kombinationen werden zur Verfügung gestellt. Ein Beispiel ist + Methode-Kombination, wo die Ergebnisse aller anwendbaren Methoden einer allgemeinen Funktion hinzugefügt werden, um den Rückwert zu schätzen. Das wird zum Beispiel mit dem Grenz-Mixin für grafische Gegenstände verwendet. Ein grafischer Gegenstand kann eine Breite allgemeine Funktion haben. Das Grenz-Mixin würde eine Grenze um einen Gegenstand hinzufügen und hat eine Methode, seine Breite schätzend. Ein neuer Klassenbegrenzter Knopf, der sowohl ein grafischer Gegenstand ist als auch das Grenz-Mixin verwendet, würde seine Breite durch das Benennen aller anwendbaren Breite-Methoden - über + Methode-Kombination schätzen alle Rückwerte werden hinzugefügt und schaffen die vereinigte Breite des Gegenstands.

Programmiersprachen dieser Gebrauch mixins

Anders als Geschmäcke und CLOS (ein Teil des Allgemeinen Lispelns) sind einige Sprachen, die mixins verwenden:

  • Ada (durch das Verlängern einer vorhandenen markierten Aufzeichnung mit willkürlichen Operationen in einem allgemeinen)
  • Die Ceylon
  • C# (mit der offenen Quellbibliothekswiedermischung)
  • ColdFusion (Hat Klasse das Verwenden gestützt, schließt ein und gestützter Gegenstand durch das Zuweisen von Methoden von einem Gegenstand bis einen anderen an der Durchlaufzeit)
  • Locke (mit der Locke RTE)
  • D (genannt "Schablone mixins")
  • Faktor
  • Fantom
  • Irrer
  • Ioke
  • Schrift von JavaFX
  • JavaScript
  • Magik
  • Wenden Sie REXX ein
  • OpenLaszlo
  • Perl
  • Perl 6
  • "Die Charakterzüge" von PHP
  • Pythonschlange
  • Schläger (mixins Dokumentation)
  • Rubin
  • Scala
  • Plausch
  • Symbian C ++
  • Strongtalk
  • Vala
  • Visueller Dataflex
  • XOTcl/TclOO (wenden Systeme für Tcl ein)
  • Selbst

Einige Sprachen wie ECMAScript (allgemein gekennzeichnet als JavaScript) unterstützen mixins auf der Sprachebene nicht, aber können sie durch das Kopieren von Methoden von einem Gegenstand bis einen anderen an der Durchlaufzeit, dadurch "das Borgen" der Methoden des mixin leicht nachahmen. Bemerken Sie, dass das auch mit statisch getippten Sprachen möglich ist, aber es verlangt das Konstruieren eines neuen Gegenstands mit dem verlängerten Satz von Methoden.

Beispiel

Allgemeines Lispeln stellt Mixins in CLOS (Allgemeines Lispeln-Gegenstand-System) ähnlich Geschmäcken zur Verfügung.

Gegenstand-Breite ist eine allgemeine Funktion mit einem Argument und verwendet + Methode-Kombination. + beschließt Methode-Kombination, dass alle anwendbaren Methoden für eine allgemeine Funktion genannt werden und die Ergebnisse hinzugefügt werden.

(defgeneric Gegenstand-Breite (Gegenstand)

(: Methode-Kombination +))

</Quelle>

Knopf ist eine Klasse mit einem Ablagefach für den Knopf-Text.

(defclass Knopf

((Text: Initform "klicken auf mich")))

</Quelle>

Es gibt eine Methode für Gegenstände des Klassenknopfs, der die auf der Länge des Knopf-Textes gestützte Breite schätzt.

+ ist der Methode-Qualifikator für die Methode-Kombination desselben Namens.

(defmethod Gegenstand-Breite + ((wenden Knopf ein))

(* 10 (Länge (Ablagefach-Wert Gegenstand 'Text))))

</Quelle>

Eine Grenz-Mixin Klasse. Das Namengeben ist gerade eine Tagung. Keine Superklassen. Keine Ablagefächer.

(defclass Grenz-Mixin )

</Quelle>

Es gibt eine Methode, die Breite der Grenze schätzend. Hier ist es gerade 4.

(defmethod Gegenstand-Breite + ((wenden Grenz-Mixin ein))

4)

</Quelle>

begrenzter Knopf ist eine Klasse, die sowohl vom Grenz-Mixin als auch von Knopf erbt.

(defclass begrenzter Knopf (Grenz-Mixin Knopf) )

</Quelle>

Wir können jetzt die Breite eines Knopfs schätzen. Das Benennen der Gegenstand-Breite rechnet 80.

Das Ergebnis ist das Ergebnis der einzelnen anwendbaren Methode: die Methode-Gegenstand-Breite für den Klassenknopf.

? (Gegenstand-Breite (Machen-Beispiel 'Knopf))

80

</Quelle>

Wir können auch die Breite eines begrenzten Knopfs schätzen. Das Benennen der Gegenstand-Breite rechnet 84.

Das Ergebnis ist die Summe der Ergebnisse der zwei anwendbaren Methoden: die Methode-Gegenstand-Breite für den Klassenknopf und die Methode-Gegenstand-Breite für das Klassengrenz-Mixin.

? (Gegenstand-Breite (Machen-Beispiel 'begrenzter Knopf))

84

</Quelle>

Auf der Locke-Webinhalt-Sprache wird Mehrfachvererbung als Klassen ohne Beispiele verwendet kann Methoden durchführen. Allgemeine mixins schließen ganzen skinnable ControlUIs ein, der von SkinnableControlUI, Benutzerschnittstelle-Delegierter-Gegenstände erbt, die dropdown Menüs verlangen, die von StandardBaseDropdownUI und solchen ausführlich genannten mixin Klassen als FontGraphicMixin, FontVisualMixin und NumericAxisMixin Klasse erben. Version 7.0 hat Bibliothekszugang hinzugefügt, so dass mixins in demselben Paket nicht zu sein oder öffentlicher Auszug zu sein brauchen. Locke-Konstrukteure sind Fabriken, der Verwenden-Mehrfachvererbung ohne ausführliche Behauptung entweder von Schnittstellen oder von mixins erleichtert.

In der Pythonschlange hat das Modul sowohl a als auch Klasse, die als ein Server für UDP und TCP Steckdose-Server handeln.

Normalerweise werden alle neuen Verbindungen innerhalb desselben Prozesses behandelt.

Zusätzlich gibt es zwei mixin Klassen: und.

Durch das Verlängern mit dem ähnlichen dieses

Klasse ThreadingTCPServer (ThreadingMixIn, TCPServer):

Pass

</Quelle>

die Klasse fügt Funktionalität zum TCP solchem Server hinzu, dass jede neue Verbindung einen neuen Faden schafft.

Wechselweise würde das Verwenden den Prozess veranlassen, für jede neue Verbindung gegabelt zu werden.

Klar ist die Funktionalität, um einen neuen Faden zu schaffen oder einen Prozess zu gabeln, als eine eigenständige Klasse nicht schrecklich nützlich.

In diesem Gebrauch-Beispiel stellen die mixins alternative zu Grunde liegende Funktionalität zur Verfügung, ohne die Funktionalität als ein Steckdose-Server zu betreffen.

Kommentar

Etwas von der Funktionalität von mixins wird durch Schnittstellen auf populären Sprachen wie Java und C# zur Verfügung gestellt. Jedoch gibt eine Schnittstelle nur an, was die Klasse unterstützen muss und keiner Durchführung zur Verfügung stellen kann. Eine andere Klasse, eine Durchführung und Abhängigen mit der Schnittstelle versorgend, ist für das Wiederfactoring allgemeines Verhalten in einen einzelnen Platz erforderlich.

Mit der Aspekt-orientierten Programmierung verbundene Schnittstellen können voll erzeugen hat mixins auf Sprachen befiedert, die solche Eigenschaften, solcher als C# oder Java unterstützen. Zusätzlich, durch den Gebrauch des Anschreiber-Schnittstelle-Musters, sind allgemeine Programmierung und Erweiterungsmethoden, C# 3.0 in der Lage, mixins nachzuahmen.

Siehe auch

  • Abstrakter Typ
  • Charakterzug (Informatik)
  • Politikbasiertes Design

Außenverbindungen


BBC-Radio 6 Musik / Syfy (das Vereinigte Königreich)
Impressum & Datenschutz