web-dev-qa-db-de.com

Mixin vs Vererbung

Was ist der Unterschied zwischen einem Mixin und einer Vererbung?

81
Johnd

Ein Mix-In wird normalerweise mit Mehrfachvererbung verwendet. In diesem Sinne gibt es also "keinen Unterschied".

Das Detail ist, dass ein Mix-In selten als eigenständiges Objekt nützlich ist.

Angenommen, Sie haben einen Mix-In-Namen "ColorAndDimension", der eine Farbeigenschaft sowie Breite und Höhe hinzufügt.

Sie können nun ColorAndDimension zu einer Form-Klasse, einer Sprite-Klasse, einer Autoklasse usw. hinzufügen. Alle haben die gleiche Schnittstelle (zB get/setColor, get/setHeight/Width usw.).

Im generischen Fall also eine Mix in IS Vererbung. Man kann jedoch argumentieren, dass es eine Frage der Rolle der Klasse in der gesamten Domäne ist, ob ein Mix in eine "primäre" Klasse oder einfach nur eine Mischung ist.

Bearbeiten - nur zur Klarstellung.

Ja, ein Mix-In kann in der heutigen modernen Fachsprache als Schnittstelle mit einer zugehörigen Implementierung betrachtet werden. Es ist wirklich nur eine einfache, alte, alltägliche Mehrfachvererbung mit einer einfachen, alten, alltäglichen Klasse. Es ist zufällig eine spezifische Anwendung von MI. Die meisten Sprachen geben keinen Mix. In jedem besonderen Status handelt es sich lediglich um eine Klasse, die so konzipiert wurde, dass sie "gemischt" wird und nicht alleine verwendet wird.

48
Will Hartung

Was ist der Unterschied zwischen einem Mixin und einer Vererbung?

Amix-inist eine Basisklasse, von der Sie erben können, um zusätzliche Funktionen bereitzustellen. Der Name "Einmischen" gibt an, dass er mit anderem Code gemischt werden soll. Daraus folgt, dass Sie die Mix-In-Klasse nicht von sich aus instanziieren würden. Häufig wird das Mix-In mit anderen Basisklassen verwendet. Daher sind mixins eine Untermenge oder ein Sonderfall der Vererbung.

Die Verwendung eines Mix-Ins gegenüber der einfachen Vererbung hat den Vorteil, dass Sie einmal Code für die Funktionalität schreiben und dann dieselbe Funktionalität in mehreren verschiedenen Klassen verwenden können. Der Nachteil besteht darin, dass Sie diese Funktion möglicherweise an anderen Orten suchen müssen, als dort, wo sie verwendet wird. Es ist daher ratsam, diesen Nachteil zu verringern, indem Sie sie in der Nähe des Geräts aufrechterhalten. 

Ich habe persönlich ein Mix-In gefunden, das für die Verwendung der Einzelvererbung notwendig ist, wenn wir eine Menge ähnlichen Codes prüfen, aber die Testfälle werden auf Basis ihrer Vererbung eines Basisfalls instanziiert und der einzige Weg, um den Code dicht zu halten Hand (und in demselben Modul), ohne mit Deckungsnummern zu verwechseln, soll von Objekt erben und die untergeordneten Fälle sowohl von der universellen Testfallbasis als auch von der benutzerdefinierten Basis erben, die nur für sie gilt.

Mixins im Vergleich und im Vergleich zu abstrakten Basisklassen

Beide sind eine Form einer übergeordneten Klasse, die nicht instanziiert werden soll.

Amixinbietet Funktionen, kann diese jedoch nicht direkt verwenden. Ein Benutzer soll es über eine (Unter-) Klasse verwenden.

Eineabstract-Basisklassebietet eine Schnittstelle, jedoch ohne nutzbare Funktionalität. Ein Benutzer soll die von der Schnittstelle aufgerufene Funktionalität erstellen.

In Python sind einige Klassen im Modul abc Beispiele für übergeordnete Klassen, die sowohl Funktionalität durch Vererbung als auch abstrakte Schnittstellen bereitstellen, die von der Unterklasse implementiert werden müssen. Diese Ideen schließen sich nicht aus.

Zusammenfassung

Vereinfacht ausgedrückt, ist ein Mix-In nur eine Basisklasse, die Sie nicht alleine instanziieren könnten, und die normalerweise als sekundäre Basisklasse bei der Mehrfachvererbung verwendet wird.

21
Aaron Hall

einmischen ist ein bestimmter, eingeschränkter Fall von (mehrfacher) Vererbung, der für Implementierungszwecke verwendet wird. Einige Sprachen (z. B. Ruby) unterstützen dies, ohne die generalisierte Mehrfachvererbung zu unterstützen.

18
Alex Martelli

Mixin ist ein abstraktes Konzept und alles, was seine Anforderungen erfüllt, kann als Mixin betrachtet werden.

Hier ist eine Definition von Wikipedia.

In objektorientierten Programmiersprachen ist ein Mixin eine Klasse, die Methoden enthält, die von anderen Klassen verwendet werden können, ohne die übergeordnete Klasse dieser anderen Klassen zu sein. Wie diese anderen Klassen Zugang zu den Methoden des Mixins erhalten, hängt von der Sprache ab. Mixins werden manchmal als "eingeschlossen" und nicht als "vererbt" bezeichnet.

Kurz gesagt, der Hauptunterschied zu einer Vererbung besteht darin, dass Mix-Ins KEINE "is-a" -Beziehung wie bei der Vererbung benötigen.

Aus der Sicht der Implementierung können Sie sich dies als Schnittstelle mit Implementierungen vorstellen. Eine abstrakte Klasse in Java könnte beispielsweise als Mixin betrachtet werden, wenn Java die Mehrfachvererbung unterstützt. 

3
Alex

"Ein Mixin ist ein Fragment einer Klasse in dem Sinne, dass es mit anderen Klassen oder Mixins zusammengesetzt werden soll." -DDJ

Ein Mixin ist eine Klasse oder ein Codefragment, das nicht für den eigenständigen Gebrauch gedacht ist, sondern stattdessen innerhalb einer anderen Klasse verwendet wird. Entweder als Mitgliedsfeld variable oder als Codesegment. Ich bin am späten am meisten ausgesetzt. Es ist ein bisschen besser als das Kopieren von Kesselplattencode.

/ - Hier ist ein großartiger DDJ-Artikel, der das Thema einführt.

Das Half-Life 2/"Source" SDK ist ein hervorragendes Beispiel für C++ - Mixins. In dieser Umgebung definieren Makros ansehnliche Codeblöcke, die hinzugefügt werden können, um der Klasse einen bestimmten "Geschmack" oder ein bestimmtes Merkmal zu verleihen.

Schauen Sie sich das Quell-Wiki-Beispiel an: Erstellen einer logischen Entität . Im Beispielcode kann das Makro DECLARE_CLASS als Mixin betrachtet werden. Das Source-SDK verwendet ausgiebig Mixins, um den Datenzugriffscode zu standardisieren und den Entitäten Verhalten zuzuordnen.

3
Karl the Pagan

Bei Mehrfachvererbung kann eine neue Klasse aus mehreren Superklassen zusammengesetzt werden. Sie können nur Methoden aufrufen, die in einer der Oberklassen definiert sind.

Auf der anderen Seite ist Mixin eine abstrakte Unterklasse, die dazu verwendet werden kann, um das Aussehen einer Vielzahl von Elternklassen zu spezialisieren. Mixins können eine Methode aufrufen (zum Beispiel sayHello(): String), obwohl sie keine solche Methode definieren. 

mixin M {
    name: String
    defmethod greetings() { print sayHello() + " " + name}
}

Wie Sie sehen, können Sie sayHello() aufrufen, obwohl es nirgendwo definiert ist. Wenn Sie das Mixin M zur Klasse C hinzufügen, sollte die C die sayHello()-Methode bereitstellen.

0
jk_

tl; dr

mixin und Mehrfachvererbung haben die gleiche Form. Aber unterschiedliche Semantik: mixin hat die Basisklassen für die Funktionsimplementierung. Für die Vererbung stellen Basisklassen eine Schnittstelle bereit, und die Unterklasse hat die Implementierung. 

Trotzdem wird die Zusammensetzung der IMO-Mischung vorgezogen

0
del bao

Ich denke, es ist wichtig zu beachten, dass mixin nicht Vererbung impliziert. Laut Wikipedia ist ein Mixin

In objektorientierten Programmiersprachen ist ein Mixin eine Klasse, die enthält Methoden, die von anderen Klassen verwendet werden können, ohne dass Elternklasse dieser anderen Klassen. Wie diese anderen Klassen gewinnen Der Zugang zu den Methoden des Mixins hängt von der Sprache ab. Mixins sind manchmal als "eingeschlossen" und nicht als "vererbt" bezeichnet.

In einer Sprache wie Perl können Mixins insbesondere mit dem Exporter-Modul hinzugefügt werden:

package Mixins;

use Exporter qw(import);
our @EXPORT_OK = qw(pity);

# assumes it will be mixed-in to a class with a _who_do_i_pity method
sub pity {
    my ($self) = @_;
    printf("I pity %s\n", $self->_who_do_i_pity('da foo'));
}

Kann in jedes Modul mit einer oder mehreren Methoden gleichzeitig gemischt werden:

package MrT

use Mixins qw(pity);

sub new {
    return bless({}, shift);
}

sub _who_do_i_pity {
    return 'da foo!'
}

Dann kann man in Ihrem MrT-Modul so verwenden:

use MrT;

MrT->new()->pity();

Ich weiß, es ist ein absurdes Beispiel, aber es bringt den Punkt rüber ...

0
Lucas