web-dev-qa-db-fra.com

Pourquoi ne pas faire une langue avec un héritage de mixin seulement?

Il semble que dans tous les domaines basés sur la classe ou prototypal OOP Langues, Mélanges sont une fois une après-longue ou une fonctionnalité secondaire. Cependant, pour moi, il ressemble à une héritage traditionnel est juste un cas spécifique d'utilisation d'un seul mixin.

Je suppose que cela est à cause des raisons historiques et de la familiarité, mais peut-être y a-t-il autre chose? Des problèmes de partage de l'état encapsulé en toute sécurité?

19
Den

Le papier séminal sur les mixines est Gilad Bracha Thèse de doctorat 'S Le langage de programmation Jigsaw: Mélangements, modularité et multiples héritage .

Il a des réponses à toutes vos questions, comme

  • Pourquoi ne pas faire une langue avec un héritage de mixin seulement?

    Jigsaw est une telle langue, tel quel Newspeak , la langue actuelle de Bracha

  • Cependant, pour moi, il semble que l'héritage traditionnel est juste un cas spécifique d'utilisation d'un seul mixin.

En effet, le héritage de mixine subsume toutes les formes classiques de héritage unique (héritage de style simulateur) (héritage de style SmallTalk, ainsi que de préfixe de style bêta), ainsi que de multiples héritage basés sur la classe avec linéarisation (Clos, C++, Python, ...)

Vous voudrez peut-être jeter un coup d'œil à Newspeak. Ne vous laissez pas berner par le fait qu'il a des "cours". Ils sont en réalité des mélanges. Le papier de Jigsaw décrit la manière dont les classes peuvent être élevées à des mélanges et c'est exactement comment cela fonctionne dans Newspeak.

Fondamentalement, un mixin est une classe qui ne connaît pas sa superclasse. Par conséquent, il peut apparaître à plusieurs endroits dans l'arbre d'héritage. (Notez que c'est pas Héritage multiple! C'est en fait, en fait, exactement exactement le contraire ou double: dans plusieurs héritage, une classe apparaît à une seule place avec plusieurs superclasses , en héritage de mixine, une classe apparaît à plusieurs endroits avec une superclasse unique.)

Dans Newspeak, OO== est pris à l'extrême: tout est un message Envoyer ("Méthode virtuelle/Appel de fonction" en Javanese/C++). Même la recherche de Superclass. Donc, lorsque vous déclarez une classe Sub comme sous-classe de Super, la superclasse de Sub n'est pas stockée dans un pointeur de la mise en œuvre interne de la mise en œuvre interne de Sub, non, chaque fois que vous avez besoin de la superclasse (par exemple lors de l'envoi de messages (méthode virtuelle/LookUp/Dispatch/Dispatch en Javanese/C++)), l'exécution interprète Super comme nom d'une méthode à appeler lequel retourne une classe. Cependant, il n'est pas connu au moment de l'exécution de la classe qu'il revient. En fait, cela pourrait rendre une classe différente à chaque fois! Par conséquent, les classes de Newspeak ne connaissent pas leur superclasse, qui est la définition d'un mixin .

Notez que dans une langue basée sur des prototypes, l'idée d'avoir un mixin dédié n'a aucun sens. L'ensemble du point d'une langue basée sur des prototypes est qu'il n'ya qu'un genre de "choses" (objets) par opposition à deux types de "choses" (objets et classes, objets et traits, objets et mélanges, ...). Ils Can être utilisé comme modèle de conception, bien sûr. C'est comme ça qu'elles ont été inventées à l'origine, après tout, dans le système d'objet des saveurs pour LISP, qui disposait de classes avec de multiples héritages, mais les classes étaient souvent utilisées de manière particulière, qu'elles ont appelé Mixins (et à partir de laquelle le système d'objet a obtenu son nom ).

31
Jörg W Mittag