読者です 読者をやめる 読者になる 読者になる

Ruby の Mix-in を C++ 風に解説

雑記

※ これはイメージです


こういうモジュール(機能の集まり)を定義して

module action {
    void disp_name()
    {
        cout << "Akira" << endl;
    }
};

それをインクルードすることでそのモジュールの機能が使えるようになる

int main()
{
    #include action;

    disp_name();

    return 0;
}


モジュールをクラスの中でインクルードすると

class person {
public:
    #include action;

    void disp_age()
    {
        cout << "23" << endl;
    }
};


インクルードしたモジュールはそのクラスのメンバとして使用できる

person akira;

akira.disp_age();
akira.disp_name();

※ これはイメージでした



これがプログラミング言語Ruby の Mix-in という仕組みであり
多重継承の新たな形として使用される



Mix-in を C++ でできるか、というと
module をマクロにしてクラス内で展開すればできることはできる



以下、Mix-in のいろんなとこでの解説を抜粋

Mix-inというのは元々Lisp界で始まった多重継承の使い方です。

Mix-inは,一般的な多重継承と比べてクラス構成を単純にできる優れたテクニックと言えます。
Mix-inというルールを導入して継承を制限し,多重継承をいわば「飼いならす」わけです。

多重継承とmixinの違いは以下の通りである.
モジュールはインスタンスを生成しない(抽象クラスであることが保証される).
(主たる)継承関係がtree構造になることが保証される.

どちらもクラスの関係の複雑さを抑える働きがある.

Rubyは多重継承は複雑さの源であるという見地から、
意図的に多重継承を持っていませんが、 モジュールを使ってクラス階層
を横断して実装を共有できます。この機能を"Mix-in"と呼びます。