Tapuscrit de l'héritage multiple

Je suis besoin de l'héritage multiple en caractères d'imprimerie.
Logiquement, il n'est pas bon de mettre beaucoup de fonctionnalités pour la hiérarchie.
J'ai une classe de base et le numéro de la hiérarchie des branches.
Mais j'ai besoin d'une certaine manière à utiliser mixages pour mettre de la logique principale dans des classes séparées, cuz il n'est pas utilisé dans chaque branche.

Mise à JOUR de code exmple:

function Mixin = function(mixins:any[]){ //mixin decorator
return function(target){
mixins.forEach((mixin) => {
add every function from mixing to target prototype, 
if functions with same name does not exists there,
so we are able to do calls to as example different render() functions   
Will show it in OpenableItem        
});
}
}
function element = function(){
return function(target){
target.prototype.element = function(){
return this.$el;
}
}
}
--------------------------------------------------------------------------------------
@element //every item will have this function as Root as Openable
class BaseItem{
y() => number; //we need to get y position of every item
}
OpenableMixin{
render() => render arrow only
open(){} => change arrow position and cause menu to fire change event
close(){} => change arrow position and cause menu to fire change event
}
class ItemsMixin extends OpenableMixing{//for now if item have childs it must be openable, 
//but Responsive has only tasks and must be openable too
addItem(item: BaseItem) //need to add generics
removeItem(item: BaseItem)  
}
--------------------------------------------------------------------------------------
@Mixin([ItemsMixin, ActivitiesMixin]) //it can have items and activities
class OpenableItem extends BaseItem implement ItemsMixin, ActivitiesMixin { //as in typescript docs
render(){
//call rendering from BaseItem class
super.render();
//call rendering from OpenableMixing
OpenableMixin.prototype.render.call(this);
//do some separate rendering for OpenableItem only
this.$el.append('line');
}   
}
@Mixin([ItemsMixin]) //it can have items
class RootItem extends BaseItem implement ItemsMixin{ //and subitems functionality is only for Root class
subitems: Array<BaseItem> //need to add generics to be able to put here different item types
}
--------------------------------------------------------------------------------------
@element
class Menu{
items: Array<Item>
}
@element
class Timeline{
menu: Menu
listAllelement() => {
console.log(this.element());
console.log(this.menu.element());
this.menu.items.forEach((item) => {
console.log(item.element());
if(item.hasChilds()){  //really it must be (item instanceof RootItem || item instanceof OpenableItem)
item.items.forEach((subitem) => { //really we need some recursion here
console.log(subitem.element());
})
}
})
}
}

En réalité, il est rare que la situation quand vous avez besoin pour mettre en œuvre l'héritage multiple, et il est très rarement quand vous pouvez avoir un tel problème en javascript. Mais chaque élément peut avoir des fonctionnalités différentes selon les besoins.

Imaginez qu'il peut être de différents éléments qui peuvent avoir nombre de mixin. Est-il sage de mettre le tout dans la base ? Et quelle est votre approche de cette question ?

Omi, vous devez utiliser DI..
Bien que l'idée de l'héritage multiple est souvent rejeté dans la programmation orientée objet, ce n'est pas vraiment une violation de principe, c'est juste qu'il n'est pas trivial à mettre en œuvre et que l'on nous apprend que c'est juste une idée stupide de toute façon. En réalité, toutes les entités peuvent être classés en différentes sans rapport avec les abstractions, et je pense qu'il serait bien d'avoir un soutien de première catégorie pour ce genre de structure de l'organisation dans une langue.
Désolé, je ne suis pas sûr de savoir comment DI peut aider dans une telle situation, mais l'exemple de code est mis à jour.
J'ai eu de la situation lors de l'héritage multiple est une bonne solution pour les petits script python. Et je n'étais pas à l'utiliser en javascript avant. Mais dans mon cas, j'ai beaucoup de différents childs, qui ont besoin d'avoir séparé la fonctionnalité n'est pas uniquement dans le rendu, mais dans les abonnements à des événements d'émetteurs et de beaucoup d'autres choses. J'étais à la recherche d'autres solutions, mais mixin semble plus logique ici.
Je déteste Microsoft pour ne pas ajouter de cela, j'ai vraiment le faire; j'ai beaucoup de duplication de code merci de ne pas avoir un simple moyen de le faire.

OriginalL'auteur Vayrex | 2016-11-25