Quand devriez-vous préférer les modèles d'héritage aux mixins dans les langages dynamiques?
Par mixins, j'entends un véritable mixage, comme lors de l'insertion de fonctions et de membres de données dans un objet lors de l'exécution.
Quand utiliseriez-vous, par exemple, l'héritage prototypique au lieu des mixins? Pour illustrer plus clairement ce que je veux dire par mixin, un pseudocode:
asCircle(obj) {
obj.radius = 0
obj.area = function() {
return this.radius * this.radius * 3.14
}
myObject = {}
asCircle(myObject)
myObject.area() // -> 0
javascript
inheritance
mixins
Magnus Wolffelt
la source
la source
Réponses:
L'héritage prototypique est simple. Il a un seul avantage sur les mixins.
C'est que c'est un lien en direct. si vous changez le prototype, tout ce qui en hérite est changé.
Exemple utilisant pd
Donc, fondamentalement, si vous souhaitez que les modifications apportées au cercle "interface" se répercutent au moment de l'exécution sur tous les objets qui "utilisent" sa fonctionnalité, héritez-en.
Si vous ne voulez pas que les changements soient reflétés, mélangez-les.
Notez que les mixins ont également plus de fonction que cela. Les mixins sont votre mécanisme d'héritage multiple.
Si vous voulez qu'un objet implémente plusieurs "interfaces", vous devrez en mélanger quelques-unes. Celui que vous utilisez pour l'héritage prototypique est celui que vous souhaitez que les modifications reflètent au moment de l'exécution, les autres seront mélangés.
la source
Mon sens du cheval me dit ceci:
Notes connexes:
la source
Utilisez le test "Is-a".
L'héritage est limité au cas où vous pouvez dire "La sous-classe EST une super-classe". C'est le même genre de chose. "Le fromage est un produit laitier".
Les mixins sont pour tout le reste. "Le fromage peut être utilisé dans un sandwich". Le fromage n'est pas un sandwich, mais il participe au sandwich.
PS. Cela n'a rien à voir avec les langages dynamiques. Tout langage d'héritage multiple avec compilation statique (c'est-à-dire C ++) a le même point de décision.
la source
Eh bien, le meilleur exemple que je puisse vous donner est un acteur pour un jeu qui a l'héritage de certains trucs de base mais utilise des mixins / plugins pour des fonctionnalités partagées. La fonctionnalité partagée pourrait être (directement à partir du code source!):
la source