mix inとは? わかりやすく解説

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

外部リンク


Mixin

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/25 06:38 UTC 版)

「LESS」の記事における「Mixin」の解説

クラス内の属性値に別クラス名指定することで、クラス属性を別クラス転用して組み込めるので、定数変数のように振舞うほか、関数のように引数使用できる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」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ

「mix in」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。



固有名詞の分類


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

辞書ショートカット

すべての辞書の索引

mix inのお隣キーワード
検索ランキング

   

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



mix inのページの著作権
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のLESS (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS