Mixins vs. Traits

Antworten:

214
  1. Mixins können Zustand enthalten, (traditionelle) Merkmale nicht.
  2. Mixins verwenden "implizite Konfliktlösung", Merkmale "explizite Konfliktlösung"
  3. Mixins hängen von der Linearisierung ab, Merkmale werden abgeflacht.

Vortrag über Eigenschaften

ad 1. In Mixins können Sie Instanzvariablen definieren. Eigenschaften erlauben dies nicht. Der Zustand muss durch Zusammenstellen der Klasse (= Klasse unter Verwendung der Merkmale) bereitgestellt werden.

ad 2. Möglicherweise liegt ein Namenskonflikt vor. Zwei Mixins ( MAund MB) oder Merkmale ( TAund TB) definieren eine Methode mit derselben Definition foo():void.

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

In Mixins werden die Konflikte beim Erstellen von Klassen C mixins MA, MB implizit gelöst.

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

Dies ruft foo():voidausMA

Andererseits muss das Verfassen von Klassen bei der Verwendung von Merkmalen Konflikte lösen.

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

Dieser Code führt zu Konflikten (zwei Definitionen von foo():void).

ad 3. Die Semantik einer Methode hängt nicht davon ab, ob sie in einem Merkmal oder in einer Klasse definiert ist, die das Merkmal verwendet.

Mit anderen Worten, es spielt keine Rolle, ob die Klasse aus den Merkmalen besteht oder der Merkmalscode in die Klasse "kopiert" wird.

jk_
quelle
5
Ich weiß, es ist ein Jahr nach dem Datum, aber für zukünftige Leser würde es in Ruby die Methode des letzten Moduls verwenden, das eingemischt wurde, also würde es foo () von MB
rik.vanmechelen
4
in Scala können Merkmale Felder haben, was bedeutet, dass sie keine "traditionellen" Merkmale sind?
Sergio
4
Ja, diese sind nicht "traditionell", sondern werden als "zustandsbehaftete" Merkmale bezeichnet. Der Unterschied zwischen Zustandsmerkmalen und Mixins sind die Punkte 2 und 3.
jk_
7
Vorläufig -1; Die Art und Weise, wie die Begriffe "Merkmal" und "Mischen" in freier Wildbahn verwendet werden, ist höchst inkonsistent und mindestens einer der Punkte hier ist größtenteils falsch. PHP und Wikipedia (und laut @Sergio auch Scala) sind sich nicht einig darüber, dass Merkmale staatenlos sind. Ich finde diese Antwort nicht nützlich, weil sie aus bloßen Behauptungen besteht und mir unklar ist, dass dies mehr ist, als wie Sie diese Wörter persönlich verwenden. Um davon überzeugt zu sein, müsste ich viele Beispiele dafür sehen, wie die Begriffe in der realen Welt (z. B. in realen Programmiersprachen) verwendet werden, um Ihre Behauptungen zu stützen.
Mark Amery
3
@AykutKllic Linearization -> "Der Compiler löst die Frage, was Super ist, ohne Mehrdeutigkeit." ( ibm.com/developerworks/library/j-jn8 )
ben
9

Diese Seiten erklären den Unterschied in der Programmiersprache D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixins sind in diesem Zusammenhang Code, der im laufenden Betrieb generiert und an dieser Stelle während der Kompilierung in den Code eingefügt wird. Sehr praktisch für einfache DSLs.

Merkmale sind externe Werte zur Kompilierungszeit (anstelle von Code, der von einer externen Quelle generiert wurde). Der Unterschied ist subtil. Mixins fügen Logik hinzu, Traits fügen Daten wie Informationen zum Typ der Kompilierungszeit hinzu.

Ich weiß nicht viel über Ruby, hoffe aber, dass dies etwas hilft.

Aiden Bell
quelle
41
Mixins und Traits in D unterscheiden sich grundlegend von den allgemeinen Begriffen in der Informatik. In D sind beide Präprozessor-Grundelemente für die automatische Codegenerierung. In anderen Sprachen handelt es sich um Vererbungsmechanismen. Die Namensentscheidung in D ist unglücklich.
Tyler