Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Если я правильно это помню, существует как минимум два способа создания mixins в С++. Это происходит из какого-то очень старого (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();
}

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Обычно mixins называются небольшими классами (часто templated или crtp based), которые вы получаете, чтобы "смешивать" некоторые функции; обычно с помощью множественного наследования и на основе политик (также см. "Современный дизайн С++" Александреску).