135 votes

Mixin vs héritage

Quelle est la différence entre un mixin et un héritage?

94voto

Will Hartung Points 57465

Un Mélange est généralement utilisé avec l'héritage multiple. Ainsi, dans ce sens, il n'y a "pas de différence".

Le détail est qu'un Mélange est rarement utile comme un objet autonome.

Par exemple, disons que vous avez un Mélange De nom "ColorAndDimension", qui ajoute une propriété de couleur et de largeur et de hauteur.

Maintenant, vous pouvez ajouter ColorAndDimension à un, disons, de la Forme de la Classe, une Classe Sprite, une Voiture de Classe, etc. Et ils ont tous la même interface (dis vous/setColor, obtenir/setHeight/Largeur, etc.)

Ainsi, dans le cas générique d'un Mélange en EST l'héritage. Mais vous pouvez soutiennent que c'est une question du rôle de la classe dans l'ensemble du domaine de savoir si un Mélange est une "primaire" de la classe ou tout simplement un mélange.

Edit -- juste pour clarifier.

Oui, un Mélange peut être considéré, dans notre jargon moderne, une Interface avec un associé de la mise en Œuvre. Il est vraiment juste de la plaine, vieux, tous les jours de l'héritage multiple à l'aide d'une plaine, vieux, tous les jours de classe. Il arrive juste à être une application spécifique de la MI. La plupart des langues ne donnent pas un Mélange De tout statut spécial, c'est juste une classe qui a été conçu pour être "mixte", plutôt que de utilisé de façon autonome.

19voto

Alex Martelli Points 330805

mélanger-en particulier, la restriction de cas de (multiples) l'héritage utilisés pour leur mise en œuvre; certaines langues (par exemple, Ruby) soutien sans l'appui généralisé de l'héritage multiple.

4voto

Bayard Randel Points 5771

Voici une belle représentation graphique du concept de Creuser en Profondeur: il Mélange (ou) avec des Modules par Gregory Brown:

http://stonecode.org/inheritance.png

"les graphiques sur la gauche destiné à représenter une situation où la plus à gauche du chemin d'accès à partir D Un est le" chemin principal, et de l'autre les chemins représentent orthogonale préoccupations. (Pensez à eux de faire les choses semblables à Ruby est Comparable ou Énumérable). Sur la droite, vous voyez la même idée, mais la superposition des orbes représentent les modules ‘mixte' de D.

L'un de ces a clairement un seul linéaire chemin jusqu'à la racine. L'autre dépendra de la manière dont votre langue a mis en œuvre sa méthode de résolution. Nous espérons que vous pouvez examiner cette question et abstraite de l'idée que n'importe quoi, même quand on mélange modules dans d'autres modules, les résultats sont un seul composant avec pas de hiérarchie attaché à elle. De cette façon, l'introduction de nouveaux modules est beaucoup moins susceptible de provoquer des conflits que l'introduction de nouvelles classes parent, considérant qu'il est rare dans les systèmes complexes, à savoir l'ensemble de la topologie assez bien pour éviter les problèmes."

3voto

Karl the Pagan Points 598

"Un mixin est un fragment d'une classe dans le sens où il est destiné à être composé avec d'autres classes ou mixin." -DDJ

Un mixin est une classe ou d'un fragment de code qui n'est pas prévu pour une utilisation autonome, mais au lieu de cela, vous êtes censé l'utiliser à l'intérieur d'une autre classe. Soit la composition en tant que membre à champ variable/ou un segment de code. J'ai le plus de l'exposition à la plus tard. C'est un peu mieux que de copier-coller de code réutilisable.

Voici un grand DDJ article qui introduit le sujet.

La Demi-Vie 2 / "Source SDK est un excellent exemple de C++ mixin. Dans cet environnement macros définir importante des blocs de code qui peuvent être ajoutés pour donner à la classe un "saveur" ou d'une fonction.

Regardez le code Source wiki exemple: Création d'une Entité Logique. Dans l'exemple de code la DECLARE_CLASS macro peut être considéré comme un mixin. Source SDK utilise mixin largement à normaliser le code d'accès aux données et d'attribuer des comportements à des entités.

0voto

jk_ Points 1737

Avec l'héritage multiple, la nouvelle classe peut être composé à partir de plusieurs super-classes. Vous pouvez appeler que des méthodes définies dans l'une quelconque des super-classes.

D'autre part, mixin est une sous-classe abstraite qui peut être utilisé pour spécialiser les beavior d'une variété de classes parentes. Mixin peut appeler une méthode (par exemple, sayHello(): String) même si elles ne définissent pas une telle méthode.

mixin M {
    name: String
    defmethod greetings() { print sayHello() + " " + name}
}

Comme vous le voyez, vous pouvez appeler sayHello() , même si elle n'est pas définie n'importe où. Si vous ajoutez le mixin M classe C, C devrait fournir à l' sayHello() méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X