Mixin 是面向物件程式設計語言中的類，提供了方法的實現。其他類可以訪問 mixin 類的方法而不必成為其子類。Mixin 有時被稱作 included 而不是 inherited。mixin 為使用它的 class 提供額外的功能，但自身卻不單獨使用（不能單獨生成例項物件，屬於抽象類）。因為有以上限制，Mixin 類通常作為功能模組使用，在需要該功能時 混入，而且不會使類的關係變得複雜。使用者與 Mixin 不是 isa 的關係，而是「able」關係。 Mixin 有利於程式碼複用又避免了多繼承的複雜。使用 Mixin 享有單一繼承的單純性和多重繼承的共有性。介面與 mixin 相同的地方是都可以多繼承，不同的地方在於 mixin 是帶實現的。Mixin 也可以看作是帶實現的。這種設計模式實現了依賴反轉原則。 歷史 Mixin 最初出現在 Symbolicscom 的面向物件系統（由 Howard Cannon 開發），使用了的面向物件方法。名稱起源於馬薩諸塞州薩默維爾的：這家冰淇淋店提供基本口味的冰淇淋（香草、巧克力等），混合入其他額外成分（堅果、曲奇、乳脂軟糖等）並稱這些為 mixin 還註冊了商標。 實現 In Simula classes are defined in a block in which attributes methods and class initialization are all defined together thus all the methods that can be invoked on a class are defined together and the definition of the class is complete In Flavors a Mixin is a class from which another class can inherit slot definitions and methods The Mixin usually does not have direct instances Since a Flavor can inherit from more than one other Flavor it can inherit from one or more Mixins Note that the original Flavors did not use generic functions In New Flavors a successor of Flavors and CLOS methods are organized in generic functions These generic functions are functions that are defined in multiple cases methods by class dispatch and method combinations CLOS and Flavors allow mixin methods to add behavior to existing methods before and after daemons whoppers and wrappers in Flavors CLOS added around methods and the ability to call shadowed methods via So for example a streamlockmixin can add locking around existing methods of a stream class In Flavors one would write a wrapper or a whopper and in CLOS one would use an around method Both CLOS and Flavors allow the computed reuse via method combinations before after and around methods are a feature of the standard method combination Other method combinations are provided An example is the method combination where the resulting values of each of the applicable methods of a generic function are arithmetically added to compute the return value This is used for example with the bordermixin for graphical objects A graphical object may have a generic width function The bordermixin would add a border around an object and has a method computing its width A new class borderedbutton that is both a graphical object and uses the border mixin would compute its width by calling all applicable width methodsvia the method combination All return values are added and create the combined width of the object In an OOPSLA 90 paper Gilad Bracha and William Cook reinterpret different inheritance mechanisms found in Smalltalk Beta and CLOS as special forms of a mixin inheritance 程式語言支援 除了 Flavors 與 CLOS 作為 Common Lisp 的部分，其他語言的支援 Ada 語言 擴充套件已存在的 tagged record Cobra ColdFusion 基於類的 includes，基於物件的賦值方法 Curl Curl RTE D 語言 稱作 template mixins D 語言包含 mixin 語句 Dart Factor 語言 Groovy JavaScript Delegation Functions 作為 Roles Traits 與 Mixins OCaml Perl 透過 Moose_Perl 的 roles Perl 6 PHP 的 Trait Python Racket mixins documentation Ruby Scala TclOO Sass Vala Swift 語言 SystemVerilog 一些語言允許執行時從一個物件複製方法到另一個物件。這可以 借 mixin 的方法。 C與 Visual BasicNET 支援介面的擴充套件方法（extension method）。 例子 Common Lisp Common Lisp 在 CLOS Common Lisp Object System 也提供 Minin 設計方法，其相似於 Flavors。 objectwidth 是一個接受一個引數的通用函式，並使用 方式結合。 這種結合方式，會讓所有應用這個方法的互叫，自動以加法結合其結果。 看個例子： defgeneric objectwidth object methodcombination button 類別擁有一段文字。 defclass button text initform click me 接著實現 button 物件的方法 objectwith，會計算文字長度後乘 10 作為回傳值。結合 方法，會使此方法每次都被呼叫，並以加法結合 繼續看下面例子。 另外，使用methodcombination 定義個通用函式，在之後定義的方法，必須都有相同簽名。意思是對於同樣名稱方法 objectwidth，其 並不可省 將會報錯。 defmethod objectwidth object button 10 length slotvalue object text 定義另一個類別 bordermixin。 做為示例，只有名字沒有特別成員、沒有父類別。 defclass bordermixin 定義其 objectwidth 方法。單純的回傳 4。 defmethod objectwidth object bordermixin 4 最後，borderedbutton 類別同時繼承了 bordermixin 和 button defclass borderedbutton bordermixin button 我們現在可以呼叫 button 的 objectwidth，會得到 80。這個結果只呼叫了 button 這意類別的 objectwidth 方法。 預設字串 click me 長度為 8，81080 objectwidth makeinstance button 80 嘗試呼叫 borderedbutton 的 objectwidth，會得到 84。這結果是呼叫 button 的 objectwidth 和 bordermixin 的 objectwidth 結果總和。 objectwidth makeinstance borderedbutton 84 我們還可以繼續在增加 borderedbutton 的 objectwidth 方法。很簡單的想讓結果在加 2。 defmethod objectwidth object borderedbutton 2 objectwidth makeinstance borderedbutton 86 Python Python 中，除了使用 protocol 以外，也可以用多繼承的形式來實現 Mixin。 首先它必須表示某一種功能，而不是某個物品。Mixin 必須責任單一，如果有多個功能，那就寫多個 Mixin 類。 Mixin 不依賴於子類的實現 子類即便沒有繼承這個 Mixin 類，也照樣可以工作，只是缺少了某個功能 多重繼承時候，Mixin 類應該在基本的父類之前（即左側） 為了區分普通的多繼承，mixin 類的類名一般都會帶上字尾：Mixin、able、ible 等。比如 Python 2 中的類 UserDictDictMixin。DictMixin 類包括部分實現，使用者的類只要實現幾個必須的函式介面，如：__getitem__ __setitem__ __delitem__ keys 。 Python 的 SocketServer 模組提供了 UDPServer 類與 TCPServer 類，作為 UDP 與 TCP 的 socket 伺服器。有兩個 mixin 類：ForkingMixIn 與 ThreadingMixIn。透過如以下程式碼的方式使用 ThreadingMixIn 擴充套件 TCPServer： class ThreadingTCPServer ThreadingMixIn TCPServer pass ThreadingMixIn 類為 TCP 伺服器添加了新功能，使每個新連線都會創建出新執行緒。而如果是 ForkingMixIn，則會使每個新連線 fork 出新的程序。 Ruby 在 ruby 中，並不直接使用 Mixin 這個單詞，而是使用在類的宣告中 include 一個 module 的辦法。 Most of the Ruby world is based around mixins via Modules The concept of mixins is implemented in Ruby by the keyword include to which we pass the name of the module as parameter Example class Student include Comparable The class Student inherits the Comparable module using the include keyword attr_accessor name score def initialize name score name name score score end Including the Comparable module requires the implementing class to define the comparison operator Heres the comparison operator We compare 2 student instances based on their scores def other score otherscore end Heres the good bit I get access to and other methods of the Comparable Interface for free end s1 Studentnew Peter 100 s2 Studentnew Jason 90 s1 s2 true s1 s2 false JavaScript 在 JavaScript 中，Mixin 可以用 Objectassign MyClassprototype MixinClass 實現。Mixin 可以有自己的父類。 物件 文字與 extend 方法 技術上可以透過繫結函式到物件的鍵，來給物件增加行為。但這導致在狀態與行為之間缺少分離等缺點： 它擾亂了模型域屬性與實現域屬性； 共同的行為沒有共享。元物件解決此問題透過分離物件的域相關屬性與行為相關的屬性。 一個擴充套件函式 來自 Underscorejs 庫，把源物件的所有功能複製到目標物件，特性，函式等 用於混合行為： This example may be contrived Its an attempt to clean up the previous broken example var Halfling function fName lName thisfirstName fName thislastName lName var NameMixin fullName function return thisfirstName thislastName rename function first last thisfirstName first thislastName last return this var sam new Halfling Sam Lowry var frodo new Halfling Freeda Baggs Mixin the other methods _extend Halflingprototype NameMixin Now the Halfling objects have access to the NameMixin methods samrename Samwise Gamgee frodorename Frodo Baggins 基於飛行 Mixin 方法的純函式與委託 上述描述方法得到廣泛使用。但下述方法更接近於 JavaScript 語言的基礎核心 Delegation 兩個基於模式的函式物件不需要 extend 的第三方實現就可完成這種技巧。 Implementation var EnumerableFirstLast function function based module pattern var first function return this 0 last function return this thislength 1 return function function based FlightMixin mechanics thisfirst first referring to thislast last shared code Application explicit delegation applying first and last enumerable behavior onto Arrays prototype EnumerableFirstLastcall Arrayprototype Now you can do a 1 2 3 afirst 1 alast 3 其他語言 In the Curl webcontent language multiple inheritance is used as classes with no instances may implement methods Common mixins include all skinnable ControlUIs inheriting from SkinnableControlUI user interface delegate objects that require dropdown menus inheriting from StandardBaseDropdownUI and such explicitly named mixin classes as FontGraphicMixin FontVisualMixin and NumericAxisMixinof class Version 70 added library access so that mixins do not need to be in the same package or be public abstract Curl constructors are factories that facilitates using multipleinheritance without explicit declaration of either interfaces or mixins 介面與 trait Java 8 introduces a new feature in the form of default methods for interfaces Basically it allows a method to be defined in an interface with application in the scenario when a new method is to be added to an interface after the interface class programming setup is done To add a new function to the interface means to implement the method at every class which uses the interface Default methods help in this case where they can be introduced to an interface any time and have an implemented structure which is then used by the associated classes Hence default methods adds a possibility of applying the concept in a mixin sort of a way Interfaces combined with aspectoriented programming can also produce fullfledged mixins in languages that support such features such as C or Java Additionally through the use of the marker interface pattern generic programming and extension methods C 30 has the ability to mimic mixins With C 30 came the introduction of Extension Methods 2 and they can be applied not only to classes but also to interfaces Extension Methods provide additional functionality on an existing class without modifying the class It then becomes possible to create a static helper class for specific functionality that defines the extension methods Because the classes implement the interface even if the actual interface doesnt contain any methods or properties to implement it will pick up all the extension methods also ECMAScript in most cases implemented as JavaScript does not need to mimic object composition by stepwise copying fields from one object to another It nativelyThe many talents of JavaScript for generalizing Role Oriented Programming approaches like Traits and Mixins April 11 2014 supports Trait and MixinAngus Croll A fresh look at JavaScript Mixins published May 31 2011JavaScript Code Reuse Patterns April 19 2013 based object composition via function objects that implement additional behavior and then are delegated via call or apply to objects that are in need of such new functionality Scala Scala has a rich type system and Traits are a part of Scalas type system which help implement mixin behaviour As their name reveals Traits are usually used to represent a distinct feature or aspect that is normally orthogonal to the responsibility of a concrete type or at least of a certain instance For example the ability to sing is modeled as such an orthogonal feature it could be applied to Birds Persons etc trait Singer def sing println singing more methods class Birds extends Singer Here Bird has mixed in all methods of the trait into its own definition as if class Bird had defined method sing on its own As extends is also used to inherit from a super class in case of a trait extends is used if no super class is inherited and only for mixin in the first trait All following traits are mixed in using keyword with class Person class Actor extends Person with Singer class Actor extends Singer with Performer Scala allows mixing in a trait creating an anonymous type when creating a new instance of a class In the case of a Person class instance not all instances can sing This feature comes use then class Person def tell println Human more methods val singingPerson new Person with Singer singingPersonsing Swift Mixin can be achieved in Swift by using a language feature called Default implementation in Protocol Extension protocol ErrorDisplayable func error messageString extension ErrorDisplayable func error messageString Do what it needs to show an error print message struct NetworkManager ErrorDisplayable func onError error Please check your internet Connection 參見 抽象型別 修飾模式 基於原則設計 Trait，一種類似結構但不要求線型複合 參考文獻 外部連結 MixIn at Portland Pattern Repository Mixins in ActionScript 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 Category 面向物件的程式設計