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.)
Donc, 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 de.
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.
Quelle est la différence entre un mixin et à l'héritage?
Un mélanger-dans est une classe de base, vous pouvez hériter de fournir des fonctionnalités supplémentaires. Pseudocode exemple:
class Mixin:
def complex_method(self):
return complex_functionality(self)
Le nom de "mélange" indique qu'il est destiné à être mélangé avec d'autres codes. En tant que tel, l'inférence, c'est que vous ne serait pas instancier le mélange dans la classe de son propre. L'objet n'a pas de données, et il ne fait aucun sens de l'instancier pour appeler complex_method. (Vous pouvez aussi bien il suffit de définir une fonction au lieu d'une classe dans ce cas.)
>>> obj = Mixin()
Fréquemment le mélange est utilisé avec d'autres classes de base.
Donc mixin sont un sous-ensemble, ou cas particulier, de l'héritage.
Les avantages de l'utilisation d'un mélange en plus de l'héritage simple est que vous pouvez écrire du code pour la fonctionnalité une fois, puis utiliser les mêmes fonctionnalités dans plusieurs classes différentes. L'inconvénient est que vous devrez peut-être regarder pour que la fonctionnalité dans d'autres lieux que ceux où il est utilisé, il est bon pour atténuer l'inconvénient en gardant à proximité.
J'ai personnellement trouvé un mélange est nécessaire d'utiliser au cours de l'héritage simple, où nous sommes unittesting beaucoup de code similaire, mais les cas de test sont instanciés basé sur leur héritage d'une base de cas, et la seule façon de garder le code à portée de main (et dans le même module), sans toucher à la couverture des nombres, est d'hériter de l'objet, et ont le cas d'enfants héritent de deux le test universel-cas de base et la coutume de base qui s'applique uniquement à eux.
Mixin dans la Comparaison et le Contraste avec les Classes de Base Abstraites
Les deux sont une forme de classe parent qui n'est pas destiné à être instancié.
Un mixin fournit des fonctionnalités, mais est incapable de l'utiliser directement. Un utilisateur est destiné à l'utiliser par l'intermédiaire d'un (sous -) classe.
Un classe de base abstraite fournit une interface, mais sans utilisable de la fonctionnalité. Un utilisateur est destiné à créer la fonctionnalité appelée par l'interface.
class Abstraction(metaclass=abc.ABCMeta):
@abc.abstractmethod
def complex_method(self):
return complex_functionality(self)
Ici, il vous est impossible d'instancier cet objet, car il nécessite une sous-classe pour implémenter des fonctionnalités avec une méthode concrète (bien que vous puissiez accéder à la fonctionnalité au sein de super()):
>>> obj = Abstraction()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstraction with
abstract methods complex_method
En Python, certaines classes dans le abc module sont des exemples de classes parent qui à la fois fournir des fonctionnalités par le biais de l'héritage et interfaces abstraites qui doivent être mis en œuvre par la sous-classe. Ces idées ne sont pas mutuellement exclusives.
Résumé
Mettre simplement, un mélange est juste une classe de base, vous ne serait pas instancier sur son propre, et généralement utilisé comme une base secondaire de classe dans l'héritage multiple.
mix-in est un particulier, restreint 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.
"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 le code réutilisable.
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 la fonctionnalité.
Regardez le code Source wiki exemple: La 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.
Mixin est une notion abstraite et quelque chose qui répond à ses besoins peut être considéré comme un mixin.
Voici une définition de Wikipedia.
Dans les langages de programmation orientée objet, un mixin est une classe qui contient des méthodes pour l'utilisation par d'autres classes sans avoir à être le parent de la classe de ceux des autres classes. Comment ceux d'autres classes d'accéder à la mixin méthodes dépend de la langue. Mixin sont parfois décrits comme étant des "inclus", plutôt que "hérité".
En bref, la clé de la différence à partir d'un héritage, c'est qu'mix-ins n'a PAS besoin d'avoir un type "est-un" de la relation, comme dans la succession.
De la mise en œuvre du point de vue, vous pouvez le penser comme une interface avec les implémentations. Par exemple, une classe abstraite Java pourrait être considéré comme un mixin si Java pris en charge l'héritage multiple.
Je vais avoir du mal à comprendre la phrase en gras. Ça sonne comme "la différence (de B?) de Un, c'est qu'il (B?) n'a besoin de quelque chose comme Un". Tu parles de la différence ou la similitude? Oups... j'ai fait une faute de frappe. Désolé de vous embrouiller. Mix-ins n'a PAS besoin d'avoir un type "est-un" de la relation
De 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.
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 à la classe C, le C doit fournir les sayHello() méthode.
pas sûr de l'exactitude de votre première déclaration - classes peuvent définir leurs propres méthodes
Je pense qu'il est important de noter, que mixin ne signifie pas héritage. Selon wikipedia, un Mixin est:
Dans les langages de programmation orientée objet, un mixin est une classe qui
contient des méthodes pour l'utilisation par d'autres classes sans avoir à être
parent de la classe de ceux des autres classes. Comment ces autres classes de gain
l'accès à la mixin méthodes dépend de la langue. Mixin sont
parfois décrit comme étant "inclus" plutôt que "hérité".
Plus précisément, dans un langage comme perl, mixin peuvent être ajoutés à l'aide du module d'exportation:
package Mixins;
use Exporter qw(import);
our @EXPORT_OK = qw(pity);
# assumes it will be mixed-in to a class with a _who_do_i_pity method
sub pity {
my ($self) = @_;
printf("I pity %s\n", $self->_who_do_i_pity('da foo'));
}
Qui peut être mélangé à un module contenant une ou plusieurs méthode(s) à un moment:
package MrT
use Mixins qw(pity);
sub new {
return bless({}, shift);
}
sub _who_do_i_pity {
return 'da foo!'
}
Puis dans votre MrT module peut être utilisé ainsi:
use MrT;
MrT->new()->pity();
Je sais que c'est absurde, par exemple, mais, il obtient le point à travers...
mixin et l'héritage multiple ont la même forme. Mais ont des sémantiques différentes: mixin a les classes de base de fournir l'implémentation de la fonction. Pour l'héritage, les classes de base de fournir de l'interface et de la sous-classe a la mise en œuvre.
Mais de toute façon, la composition est préféré au mixin OMI
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.)
Donc, 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 de.
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.
OriginalL'auteur Will Hartung
Un mélanger-dans est une classe de base, vous pouvez hériter de fournir des fonctionnalités supplémentaires. Pseudocode exemple:
Le nom de "mélange" indique qu'il est destiné à être mélangé avec d'autres codes. En tant que tel, l'inférence, c'est que vous ne serait pas instancier le mélange dans la classe de son propre. L'objet n'a pas de données, et il ne fait aucun sens de l'instancier pour appeler complex_method. (Vous pouvez aussi bien il suffit de définir une fonction au lieu d'une classe dans ce cas.)
Fréquemment le mélange est utilisé avec d'autres classes de base.
Donc mixin sont un sous-ensemble, ou cas particulier, de l'héritage.
Les avantages de l'utilisation d'un mélange en plus de l'héritage simple est que vous pouvez écrire du code pour la fonctionnalité une fois, puis utiliser les mêmes fonctionnalités dans plusieurs classes différentes. L'inconvénient est que vous devrez peut-être regarder pour que la fonctionnalité dans d'autres lieux que ceux où il est utilisé, il est bon pour atténuer l'inconvénient en gardant à proximité.
J'ai personnellement trouvé un mélange est nécessaire d'utiliser au cours de l'héritage simple, où nous sommes unittesting beaucoup de code similaire, mais les cas de test sont instanciés basé sur leur héritage d'une base de cas, et la seule façon de garder le code à portée de main (et dans le même module), sans toucher à la couverture des nombres, est d'hériter de l'objet, et ont le cas d'enfants héritent de deux le test universel-cas de base et la coutume de base qui s'applique uniquement à eux.
Mixin dans la Comparaison et le Contraste avec les Classes de Base Abstraites
Les deux sont une forme de classe parent qui n'est pas destiné à être instancié.
Un mixin fournit des fonctionnalités, mais est incapable de l'utiliser directement. Un utilisateur est destiné à l'utiliser par l'intermédiaire d'un (sous -) classe.
Un classe de base abstraite fournit une interface, mais sans utilisable de la fonctionnalité. Un utilisateur est destiné à créer la fonctionnalité appelée par l'interface.
Ici, il vous est impossible d'instancier cet objet, car il nécessite une sous-classe pour implémenter des fonctionnalités avec une méthode concrète (bien que vous puissiez accéder à la fonctionnalité au sein de
super()
):En Python, certaines classes dans le
abc
module sont des exemples de classes parent qui à la fois fournir des fonctionnalités par le biais de l'héritage et interfaces abstraites qui doivent être mis en œuvre par la sous-classe. Ces idées ne sont pas mutuellement exclusives.Résumé
Mettre simplement, un mélange est juste une classe de base, vous ne serait pas instancier sur son propre, et généralement utilisé comme une base secondaire de classe dans l'héritage multiple.
OriginalL'auteur Aaron Hall
mix-in est un particulier, restreint 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.
OriginalL'auteur Alex Martelli
"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 le 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 la fonctionnalité.
Regardez le code Source wiki exemple: La 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.
OriginalL'auteur Karl the Pagan
Mixin est une notion abstraite et quelque chose qui répond à ses besoins peut être considéré comme un mixin.
Voici une définition de Wikipedia.
Dans les langages de programmation orientée objet, un mixin est une classe qui contient des méthodes pour l'utilisation par d'autres classes sans avoir à être le parent de la classe de ceux des autres classes. Comment ceux d'autres classes d'accéder à la mixin méthodes dépend de la langue. Mixin sont parfois décrits comme étant des "inclus", plutôt que "hérité".
En bref, la clé de la différence à partir d'un héritage, c'est qu'mix-ins n'a PAS besoin d'avoir un type "est-un" de la relation, comme dans la succession.
De la mise en œuvre du point de vue, vous pouvez le penser comme une interface avec les implémentations. Par exemple, une classe abstraite Java pourrait être considéré comme un mixin si Java pris en charge l'héritage multiple.
Oups... j'ai fait une faute de frappe. Désolé de vous embrouiller. Mix-ins n'a PAS besoin d'avoir un type "est-un" de la relation
OriginalL'auteur Alex
De 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.Comme vous le voyez, vous pouvez appeler
sayHello()
même si elle n'est pas définie n'importe où. Si vous ajoutez le mixinM
à la classeC
, leC
doit fournir lessayHello()
méthode.OriginalL'auteur jk_
Je pense qu'il est important de noter, que mixin ne signifie pas héritage. Selon wikipedia, un Mixin est:
Plus précisément, dans un langage comme perl, mixin peuvent être ajoutés à l'aide du module d'exportation:
Qui peut être mélangé à un module contenant une ou plusieurs méthode(s) à un moment:
Puis dans votre
MrT
module peut être utilisé ainsi:Je sais que c'est absurde, par exemple, mais, il obtient le point à travers...
OriginalL'auteur Lucas
tl;dr
mixin et l'héritage multiple ont la même forme. Mais ont des sémantiques différentes: mixin a les classes de base de fournir l'implémentation de la fonction. Pour l'héritage, les classes de base de fournir de l'interface et de la sous-classe a la mise en œuvre.
Mais de toute façon, la composition est préféré au mixin OMI
OriginalL'auteur del bao