2010-02-24 4 views

Antwort

9

Für einen guten Vergleich und für die Begründung, warum Merkmale bevorzugt werden, können Sie die traits paper (pdf) überprüfen.

Im Wesentlichen ist es, was Lukas Renggli sagte:

Traits Mitglieder in einer Klasse zusammengesetzt sind, und nicht seine Vererbungshierarchie ändern. Konflikte müssen vom Nutzer der Merkmale explizit gelöst werden.

Mixins werden in die Vererbungshierarchie der Zielklasse linearisiert. Wenn es widersprüchliche Mitglieder gibt, bestimmt die Reihenfolge, in der sie deklariert wurden, welches Mitglied angerufen wird. Dies ist zerbrechlich, weil es implizit das Verhalten der Komposition definiert, und der Klassenautor muss sich der potenziellen Konflikte bewusst sein und wie sie sich auf die resultierende Klasse auswirken.

Da Mixins linearisiert werden, leiden sie nicht unter dem berüchtigten "Diamantproblem" der Mehrfachvererbung.Die fragile Natur, in der sie gestapelt sind, ist ein weiteres Problem, das ich mit dem "Rubin-Problem" bezeichne, um mit der Metapher des kostbaren Steins zu bleiben. Aus einigen seltsamen Gründen, die mit moose zu tun haben, zeigen Perlen nicht das Problem sowie Rubine.

9

Eigenschaften werden mit einer Kompositionsregel zusammengesetzt. Konflikte müssen manuell aufgelöst werden, es kann nicht vorkommen, dass eine Eigenschaft versehentlich eine andere Methode mit demselben Namen überschreibt.

Mixins werden in der Reihenfolge zusammengesetzt und haben daher ähnliche Fragilitätsprobleme wie die Mehrfachvererbung.

+1

Die Fragilität, die normalerweise mit Mehrfachvererbung verbunden ist, ist "das Diamantproblem" - keine deterministische Auflösung der Methode mit demselben Namen und derselben Signatur, die von mehreren Klassen geerbt wird. Im Falle von Mixins, wie Sie bereits angemerkt haben, bestimmt die Reihenfolge der Zusammensetzung, wie Methoden gelöst werden, so dass Mixins nicht unter dem "Diamantproblem" leiden. – Yardena

+2

Ja tun sie, aber es ist in einer voreingenommenen Weise. Wenn Sie zwei Methoden 'm()' und 'n()' aus 'Mixin1' und' Mixin2' erhalten, dann können Sie nur beide Methoden von einem Mix-In haben. Wenn Sie eine Methode von 'Mixin1' und die andere von' Mixin2' wollen, stecken Sie fest. –

+1

Was Sie beschreiben, ist nicht, was als "das Diamantproblem" bekannt ist. Ich bin mir nicht sicher, ob es überhaupt ein Problem ist - Mixin sollte eine minimale Einheit wiederverwendbaren Verhaltens darstellen, so dass es natürlich nicht weiter zerlegt werden kann ... – Yardena

8

In Neusprech sind alle Klassen Mixins. Hier sind einige Auszüge aus Gilad Bracha Antwort auf eine ähnliche Frage in Newspeak discussion forum:

Mixins sind kein Merkmal von Neusprech per se. Das heißt, wir haben die Sprache nicht mit dem Spruch entworfen, ok, jetzt fügen wir Mixins hinzu. Mixins fallen automatisch aus Klassenverschachtelung und Nachrichtenbasiert Semantik. Das heißt, wenn Sie virtuelle Klassen haben, haben Sie Mixins , es sei denn Sie tatsächlich verbieten. ...

Traits versuchen, wahrgenommene Problem von Mixins zu adressieren.

  1. Es gibt sehr wenig echte Erfahrung, die anzeigt, dass diese wahrgenommenen Probleme real sind.
  2. Merkmale sind auf Zustandslosigkeit beschränkt. Dies vereinfacht die Angelegenheit, aber nicht alle Fälle von Interesse. In der Tat gibt es jetzt Forschungspapiere, die versuchen, Eigenschaften zu Eigenschaften hinzuzufügen.

Traits werden vollständig von einem allgemeines Modell subsumiert, die ich in meiner Doktorarbeit vor vielen Jahren entwickelt (erhältlich off meiner Web-Site, wenn Sie tief wollen graben wirklich). ... Ich würde gerne prüfen, wie wir diese Kombinatoren in Newspeak integrieren könnten. ...

Verwandte Themen