web-dev-qa-db-fra.com

Quel est le style mixin C ++?

Je viens de rencontrer ce mot clé C++ Mixin-Style, faire quelqu'un savoir ce que c'est?

Dans ce post , a été répondu comme un motif de conception. Est-ce le même modèle de conception que décrit dans ce document ?

35
Bitmap

mélanges sont un concept de LISP. Une bonne explication de Dr. Dobbs :

Un mixin est un fragment d'une classe dans le sens où il est destiné à être composé d'autres classes ou mélanges.
[...]
[.____] la différence entre une classe régulière et autonome (telle que la personne) et un mixin est qu'un mixin modélise une petite tranche de fonctionnalité (par exemple, l'impression ou l'affichage) et n'est pas destinée à une utilisation autonome. Il est plutôt censé être composé d'une autre catégorie nécessitant cette fonctionnalité (personne, par exemple).

Donc, le point d'un mixin est de permettre quelque chose comme Multiplement-héritage, sans toutes les mauvaises choses qui viennent généralement avec de multiples héritages.

Cela peut être un peu déroutant, cependant, car C++ ne prend pas de manière native mélanges; Afin de "faire" mixines en C++, vous devez utiliser plusieurs héritiers! Ce que cela finit par le sens dans la pratique, c'est que vous utilisez toujours plusieurs héritiers, mais vous limitez d'artificiellement ce que vous vous permettez de l'utiliser.

Voir l'article ci-dessus pour une implémentation de mixine réelle.

Si je me souviens de cela correctement, il existe au moins deux façons de créer des mixines en C++. Cela provient d'un didacticiel très ancien (1995) que j'ai vu (mais c'est presque complètement disparu d'Internet).

D'abord,

class MixinBase {
public :
    void f() {};
};

template<class T>
class Mixin : public T {
public:
    void f() {
        T::f();
        T::f();
    }
};

template<class T>
class Mixin2 : public T {
public :
    void g() {
        T::f();
        T::f();
    }
};

int main() {
    Mixin2<Mixin<MixinBase>> mix;
    mix.g();
}

Ou une autre manière utilise un héritage virtuel et des appels de frère de soeur:

class Base {
public :
    virtual void f() = 0;
};

class D1 : public virtual Base {
public :
    void g() {
        f();
    }
};

class D2 : public virtual Base {
public :
    void f() {
    }
};

class D : public D1, public D2 {
};

int main() {
    D d;
    d.g();
}

Maintenant, ces deux versions implémentent des mixines, car MixIn et MixIn2 sont des classes indépendantes, mais elles peuvent toujours communiquer. Et vous pouvez créer des logiciels à partir de ce type de modules, puis lier ensuite ces modules à un grand logiciel. Même se produit entre D1 et D2 dans le héritage virtuel. Une chose importante de noter que dans la conception de mixin, les différents modules vivent à l'intérieur du même objet C++. (OH et CRTP sont une technique différente)

15
tp1

Un mixin est une classe (ou un autre regroupement de code) destiné à être réutilisé grâce à une inclusion directe dans une autre pièce de code. Pensez-y comme héritage sans polymorphisme sous-type. Le CRTP est un moyen d'approximation de mixines en C++.

8
Mankarse

Habituellement, des mélanges sont appelées petites classes (souvent modèles ou à base de CRTP) que vous dérivez de "mélanger" certaines fonctionnalités; Habituellement via plusieurs héritages et dans des conceptions basées sur des politiques (voir également "la conception moderne C++" par Alexandrescu).

4
PlasmaHH