ミックスインとは? わかりやすく解説

Mixin

(ミックスイン から転送)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/01/22 05:41 UTC 版)

mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。言語によっては、その言語でクラスや継承と呼ぶものとは別のシステムとして mixin がある場合もある(#バリエーションの節で詳述)。

概要

オブジェクト指向プログラミングにおいて、継承は本来は特化を意図したものである。すなわち、継承する側(派生型)と継承される側(基底型)の間にはリスコフの置換原則があることを前提とする。

しかし実際のところは、実装の再利用のための手段として使われることが多い(濫用されがちであるが)。mixin における継承も、前述のような特化のためではなく、複数の機能を集めるための手段である。特にクラスの多重継承が可能なシステムでは、複数の mixin クラスを多重継承し、「単に複数の機能を持つクラス」を簡単に作る、というような使い方ができる。典型例としては、InputStream と OutputStream という mixin クラスを多重継承して、InputOutputStream という双方向ストリームのクラスとする、といったようなパターンである。

mixin は、そのようなもの自体はそれ以前からも考えられていたが、1970年代のMIT系Lisp方言のオブジェクト指向システム Flavors(en:Flavors (programming language))でその名が使われ、それが一般化した。Flavorsは、同時期のSmalltalkのオブジェクト指向システムに影響された試みのひとつであるが多重継承を特長とした。名称の由来は、マサチューセッツ州 Somerville にあったアイスクリーム屋[1]からヒントを得て考え出されたものである[2]このアイスクリーム店の店長は(バニラやチョコレートなどの)基本となる味(Flavor)を混ぜ、追加の具材(ナッツ、クッキー、キャンディなど)と組み合わせたものを提供し、それを Mix-In と呼んで店の登録商標としていた[3]

mixin はコードの再利用を促進する。しかし、mixin にはそれなりの妥協も伴う。

(クラスの多重継承すなわち実装の多重継承ができず、インタフェースの複数実装による型の多重継承のみができる、例えばJavaC#などの観点からは)mixin は、「メソッド実装付きのインタフェース」ということもできる。クラスが mixin を含む場合、そのインタフェースを実装したクラスは、mixin の属性と操作を取り込む。継承するというのとは異なっている。取り込んだ要素はコンパイル時にクラスの一部となる。興味深いことに、mixin はインタフェースを実装する必要はない。それでもあえてインタフェースを実装する利点は、そのインタフェースを必要とするメソッドに、引数としてインスタンスを渡せるからである。

バリエーション

クラスとその継承関係とは別のものとして mixin を活用している言語としてRubyがある。Rubyではクラスの継承は単一継承のみとし、多重継承にまつわる問題(例えば菱形継承問題)を避けた。そして「継承関係の無いクラスのようなもの」としてモジュールと呼ばれる言語機能があり、モジュールは複数個(いくつでも)クラスに「mixinする」ことができる。モジュール自体は何かを継承したりはしていないため、菱形継承問題は起きない。

その他、mixinのようなものがある言語。

Python

Python の、特に Python 2.3 以降および Python 3 では C3 linearization により多重継承した際のメソッド探索順は解決されるので、多重継承は有力な手法であり、実際にいくつか活用例がある。SocketServer モジュールは UDP および TCP ソケットサーバとして動作する UDPServerTCPServer クラスの両方を備えている。通常、すべてのコネクションは同じプロセス内で処理されるが、ForkingMixInThreadingMixIn という追加の mixin クラスが存在する。下記のように TCPServer を ThreadingMixIn により拡張すると、

class ThreadingTCPServer(ThreadingMixIn, TCPServer):
  pass

ThreadingMixInTCPServer にコネクションごとにスレッドを生成する機能を追加する。あるいは、ForkingMixIn を用いると各新規のコネクションに対してプロセスが fork される。明らかに、スレッドを生成したりプロセスを fork する機能は単独では大して役に立たない。

この使用例では、mixin はソケットサーバとしての機能に影響することなく、基盤となる機能を選択可能な形で提供している。

C#

C#ではインタフェースと拡張メソッドの組合せによって、Mix-inを再現できる。

using System.Linq;

  System.Collections.Generic.IEnumerable<int> range = Enumerable.Range(1, 10);
  // IEnumerable<T>にはSum()メソッドは定義されない。
  // 実際にはSystem.Linq.Enumerableクラスに実装された拡張メソッドである。
  int sum = range.Sum();

  // 上記は下記の糖衣構文である。
  int sum = Enumerable.Sum(range);

関連項目

  1. ^ Steve's Ice Cream Parlor
  2. ^ Using Mix-ins with Python
  3. ^ LISTSERV 14.4

外部リンク


ミックスイン

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/05 08:46 UTC 版)

継承 (プログラミング)」の記事における「ミックスイン」の解説

詳細は「Mixin」を参照 ミックスイン(Mix-in)は、多重継承問題の解決策発端したもう一つ継承方法論である。メソッド集合体継承することで、その機能クラス注入することを目的にしており、メソッド集合体クラスの間には汎化/特化の関係がないままで多重継承前提にしている。そのメソッド集合体トレイトとされることが多く、他にモジュールプロトコルロールといった形態もある。トレイト継承インクルードと呼ぶのが好まれ多重継承前提である。ミックスインはそれらをひっくるめた方法論としての用語になっている界面継承インターフェース抽象メソッドをまとめたクラス)と、Mix-in継承トレイト独立メソッドをまとめたモジュール)は双方とも多重継承前提なのでよく対比され説明される双方違い列挙すると以下のようになる界面継承抽象メソッドクラス相続させるのに対してMix-in継承独立メソッドクラス贈与する界面継承インターフェース継承クラス実装メソッド記述するが、Mix-in継承トレイト実装メソッド記述する界面継承同名アルゴリズム個々クラスメソッド分散記述するが、Mix-in継承一つメソッド個々クラスアルゴリズム一括記述するインターフェースはデータメンバを持つことを想定されていないが、トレイトはデータメンバを持つ。すなわち界面継承派生メソッドたち専用共有データ持てないが、Mix-in継承はそれが可能である。 界面継承はthis参照暗黙使用できるが、Mix-in継承不可なのでThis参照明示的な引数渡し関連型の機能必要になるインターフェース記名型付けであるのに対してトレイト構造的型付け識別されることが多い。

※この「ミックスイン」の解説は、「継承 (プログラミング)」の解説の一部です。
「ミックスイン」を含む「継承 (プログラミング)」の記事については、「継承 (プログラミング)」の概要を参照ください。

ウィキペディア小見出し辞書の「ミックスイン」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ミックスイン」の関連用語

ミックスインのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ミックスインのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのMixin (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの継承 (プログラミング) (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS