Quando você deve preferir padrões de herança a mixins em linguagens dinâmicas?
Por mixins, refiro-me à mistura adequada real, como na inserção de funções e membros de dados em um objeto em tempo de execução.
Quando você usaria, por exemplo, herança prototípica em vez de mixins? Para ilustrar mais claramente o que quero dizer com mixin, alguns pseudocódigo:
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
fonte
fonte
Respostas:
A herança prototípica é simples. Tem uma vantagem única sobre mixins.
Isso é que é um link ao vivo. se você alterar o protótipo, tudo o que herdar será alterado.
Exemplo usando pd
Então, basicamente, se você deseja que as alterações no círculo da "interface" sejam refletidas no tempo de execução para todos os objetos que "usam" sua funcionalidade, herda-a.
Se você não quiser que as alterações sejam refletidas, misture-as.
Observe que os mixins também têm mais finalidade do que isso. Mixins são o seu mecanismo para múltiplas "heranças".
Se você quer um objeto para implementar várias "interfaces", então você vai ter que misturar um pouco. O que você usa para a herança prototípica é o que você quer mudanças para refletir para em tempo de execução, os outros serão misturado.
fonte
Meu senso de cavalo me diz isso:
Notas relacionadas:
fonte
Use o teste "Is-a".
A herança é limitada ao caso em que você pode dizer "Subclasse É Uma Superclasse". Eles são o mesmo tipo de coisa. "O queijo é um produto lácteo".
Mixins são para todo o resto. "O queijo pode ser usado em um sanduíche". O queijo não é um sanduíche, mas participa do sanduíche.
PS. Isso não tem nada a ver com linguagens dinâmicas. Qualquer linguagem de herança múltipla com compilação estática (ou seja, C ++) tem o mesmo ponto de decisão.
fonte
Bem, o melhor exemplo que posso dar a você é um ator de um jogo que tem herança para algumas coisas básicas, mas usa mixins / plugins para funcionalidade compartilhada. A funcionalidade compartilhada pode ser (diretamente do código-fonte!):
fonte