Что такое C ++ Mixin-Style? - PullRequest
       6

Что такое C ++ Mixin-Style?

35 голосов
/ 17 августа 2011

Я только что натолкнулся на это ключевое слово C++ Mixin-Style, кто-нибудь знает, что это такое?

В в этом сообщении ответ был принят как шаблон дизайна.Это тот же шаблон проектирования, который описан в этом документе ?

Ответы [ 5 ]

20 голосов
/ 17 августа 2011

Mixins - это концепция от Lisp.Хорошее объяснение от Доктор.Dobbs :

Миксин - это фрагмент класса в том смысле, что он предназначен для объединения с другими классами или миксинами.
[...]
Разница между обычным, автономным классом (например, Person) и миксином заключается в том, что миксины моделируют небольшой фрагмент функциональности (например, печать или отображение) и не предназначены для автономного использования.Скорее, он должен быть составлен с некоторым другим классом, нуждающимся в этой функциональности (например, Person).

Итак, цель миксина состоит в том, чтобы разрешить что-то как , кратное- наследование без всех плохих вещей ™, которые обычно сопровождаются множественным наследованием.

Однако это может немного сбивать с толку, поскольку C ++ изначально не поддерживает миксины;чтобы «делать» миксины в C ++, вы должны использовать множественное наследование!На практике это означает, что вы все еще используете множественное наследование, но вы искусственно ограничиваете то, для чего вы позволяете себе его использовать.

См. Статью выше для фактической реализации миксина.

14 голосов
/ 17 августа 2011

Если я правильно помню, есть как минимум два способа создания миксинов в C ++. Это взято из какого-то очень старого (1995) учебника, который я видел (но он почти полностью исчез из интернета).

Во-первых,

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();
}

Или другой способ использует виртуальное наследование и вызовы одного брата:

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();
}

Теперь в обеих этих версиях реализованы миксины, поскольку Mixin и Mixin2 являются независимыми классами, но они все еще могут общаться. И вы можете создавать программное обеспечение из таких модулей, а затем просто связать эти модули с одним большим программным обеспечением. То же самое происходит между D1 и D2 в виртуальном наследовании. Важно отметить, что в смешанном дизайне разные модули живут внутри одного и того же объекта C ++. (ой и CRTP это другая техника)

8 голосов
/ 17 августа 2011

Mixin - это класс (или другая группа кода), который предназначен для повторного использования посредством прямого включения в другой фрагмент кода. Думайте об этом как о наследовании без полиморфизма подтипа. CRTP - это способ аппроксимации Mixins в C ++.

5 голосов
/ 06 марта 2015

Миксины в C ++ выражаются с использованием любопытно повторяющегося шаблона (CRTP). Этот пост представляет собой отличную разбивку того, что они предоставляют по сравнению с другими методами повторного использования ... полиморфизм во время компиляции.

4 голосов
/ 17 августа 2011

Обычно миксины называются небольшими классами (часто на основе шаблонов или на основе crtp), которые вы производите для «добавления» некоторых функций; обычно через множественное наследование и в проектах на основе политик (см. также «Современный дизайн C ++» Александреску).

...