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 にはそれなりの妥協も伴う。
(クラスの多重継承すなわち実装の多重継承ができず、インタフェースの複数実装による型の多重継承のみができる、例えばJavaやC#などの観点からは)mixin は、「メソッド実装付きのインタフェース」ということもできる。クラスが mixin を含む場合、そのインタフェースを実装したクラスは、mixin の属性と操作を取り込む。継承するというのとは異なっている。取り込んだ要素はコンパイル時にクラスの一部となる。興味深いことに、mixin はインタフェースを実装する必要はない。それでもあえてインタフェースを実装する利点は、そのインタフェースを必要とするメソッドに、引数としてインスタンスを渡せるからである。
バリエーション
クラスとその継承関係とは別のものとして mixin を活用している言語としてRubyがある。Rubyではクラスの継承は単一継承のみとし、多重継承にまつわる問題(例えば菱形継承問題)を避けた。そして「継承関係の無いクラスのようなもの」としてモジュールと呼ばれる言語機能があり、モジュールは複数個(いくつでも)クラスに「mixinする」ことができる。モジュール自体は何かを継承したりはしていないため、菱形継承問題は起きない。
その他、mixinのようなものがある言語。
- D言語 (「テンプレート・ミクスイン」と呼ばれる)
- Dylan
- Perl
- Python
- Ruby
- Scala
- Self
- Strongtalk
- Object REXX
- XOTcl(Tcl 向けのオブジェクト指向拡張])
- Groovy
- Vala
例
Python
Python の、特に Python 2.3 以降および Python 3 では C3 linearization により多重継承した際のメソッド探索順は解決されるので、多重継承は有力な手法であり、実際にいくつか活用例がある。SocketServer
モジュールは UDP および TCP ソケットサーバとして動作する UDPServer
と TCPServer
クラスの両方を備えている。通常、すべてのコネクションは同じプロセス内で処理されるが、ForkingMixIn
と ThreadingMixIn
という追加の mixin クラスが存在する。下記のように TCPServer を ThreadingMixIn により拡張すると、
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass
ThreadingMixIn
が TCPServer
にコネクションごとにスレッドを生成する機能を追加する。あるいは、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);
関連項目
注
- ^ Steve's Ice Cream Parlor
- ^ Using Mix-ins with Python
- ^ LISTSERV 14.4
外部リンク
- Wiki entry at Cunningham & Cunningham, Inc.
- Mixins in ActionScript.
- Scala Overview: Mixin Class Composition - a step-by-step example in Scala
- The Common Lisp Object System: An Overview by Richard P. Gabriel and Linda DeMichiel provides a good introduction to the motivation for defining classes by means of generic functions.
Mixin
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/25 06:38 UTC 版)
クラス内の属性値に別クラス名を指定することで、クラス属性を別クラスに転用して組み込めるので、定数や変数のように振舞うほか、関数のように引数を使用できる。CSSはミックスインに対応しておらず、同一コードを各位置に連記する必要がある。これにより効率的なコーディングや記述の簡略化だけでなく、内容変更を容易にする。 .rounded-corners (@radius: 5px) { border-radius: @radius; -webkit-border-radius: @radius; -moz-border-radius: @radius;}#header { .rounded-corners;}#footer { .rounded-corners(10px);} コンパイル結果 #header { border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px;}#footer { border-radius: 10px; -webkit-border-radius: 10px; -moz-border-radius: 10px;}
※この「Mixin」の解説は、「LESS」の解説の一部です。
「Mixin」を含む「LESS」の記事については、「LESS」の概要を参照ください。
「mix in」の例文・使い方・用例・文例
- 「アサガオ」に対する英語は「morning glory」です
- Holman Healthは栄養補助食品業界の巨大企業で、最高経営責任者であるBud Rollinsを交代させようとしているが、Bud Rollinsは機会があるたびに、彼と同社取締役会とがあらゆる点で合意できるようには思えないと公言していた。
- 私は6月後半に休暇を取るので、参加のご要望は必ずLyle GrodinをCCに入れてください。
- 工事が完了するまで、正面とVine通りの入口からしかセンターに入れない。
- 昨年までは、Train FirstとTop Shareと契約をしていました。
- 興味のある方は、12月5日までに、履歴書と少なくとも2通の職務に関する推薦状を添付したEメールを、Singh金融サービスのMisa Takahama、mtakahama@singhfs.comまで送ってください。
- 現在、香港のMing銀行で下級市場アナリストとして働いており、この職に就いて2 年半になります。
- 私はBellingham大学の数学の学位があり、どちらの推薦状にも書かれているように、高いコミュニケーションスキルを持ち合わせています。
- John AbrahamsとTina Linがアンケートデータの収集担当で、この作業は5 月5 日までに終わるでしょう。
- 配達はWestlake、Pinewood、Ramona限定
- Direct Marketingという会社が、私たちの卸売業者となることに同意してくれました。
- この地域では、Direct Marketingは比較的新しい企業ですが、すでに地元の小売店だけでなく、近隣の州の大小の小売店とも、しっかりとした関係を確立しています。
- Direct Marketingと、円滑で長く続く関係が築けることを期待しています。
- この家は北側がWinona川に接しており、美しく景観の整えられた半エーカーの土地に位置しています。
- 詳細は、Sophistication のウェブサイト、www.sophistication-magazine.comをご覧ください。
- Bryce Rollins の回顧展が、6 月17 日から9 月15 日までSchulz美術館にて、同美術館の35 周年を祝って行われる。
- 1970 年代初頭以来、独特の皮肉精神を持つRollinsは、近代化によってもたらされた複雑な社会を風刺した、印象的な作品を立て続けに発表している。
- Rollinsの回顧展の期間中、Schulzの、アフリカ美術の常設コレクションを収容する一画は閉鎖される。
- Bryce Rollinsの人生を説明すること。
- caffeinelessをcaffeinlessと間違ってつづった。
固有名詞の分類
- mix inのページへのリンク