في لغات البرمجة كائنية التوجه ، Mixin (أو mixin) [1] [2] [3] [4] هو صنف (حوسبة) class الذي تحتوي على طرق methods لاستخدامها من قبل اصنافclasses أخرى دون أن تكون الصنف الأصل parent classمن تلك الفئات الأخرى. تعتمد كيفية وصول تلك الفصول الأخرى إلى أساليب mixin على اللغة. يوصف mixin في بعض الأحيان بأنه "مدرج" "included"بدلاً من "موروث" "inherited".
يشجع Mixins على إعادة استخدام الكود ويمكن استخدامه لتجنب غموض الميراث الذي يمكن أن يسببه الميراث المتعدد [5] (" مشكلة الماس ""diamond problem") ، أو للتغلب على عدم دعم الميراث المتعدد في اللغة. يمكن أيضًا اعتبار المزيج كواجهة interfaceمع الطرق المنفذة methods. هذا النمطpattern هو مثال لفرض مبدأ انعكاس التبعية dependency inversion principle.
التاريخ
ظهر Mixins لأول مرة في نظام Flavors الموجهة للكائنات في Symbolics (تم تطويره بواسطة Howard Cannon) ، والذي كان نهجًا في اتجاه الكائن المستخدم في Lisp Machine Lisp . الاسم مستوحى من صالون Steve's Ice Cream Parlour في Somerville ، ماساتشوستس: [1] قدم صاحب متجر الآيس كريم نكهة أساسية من الآيس كريم (الفانيليا والشوكولاتة، وما إلى ذلك) وتمزج في مزيج من العناصر الإضافية (المكسرات، الكوكيز، حلوى، وما إلى ذلك) ويسمى هذا البند على " مزيج ""mix-in"، له عبارة علامة تجارية خاصة في ذلك الوقت. [2]
تعريف
Mixins هي مفهوم لغوي يسمح للمبرمج بحقن بعض التعليمات البرمجية في صنف (حوسبة) class. برمجة Mixin هي نمط من تطوير البرمجيات ، حيث يتم إنشاء وحدات الوظائف في class صنف ثم يتم مزجها مع class اصناف أخرى. [6]
يعمل class صنف mixin كفئة رئيسية، وتحتوي على الوظيفة المطلوبة. يمكن supclass لصنف فرعي أن ترث أو تعيد استخدام هذه الوظيفة، ولكن ليس كوسيلة للتخصص. عادةً، يقوم المزيج بتصدير الوظيفة المطلوبة إلى child class صنف فرعي ، دون إنشاء علاقة مفردة جامدة "هل هي ""is a". هنا يكمن الاختلاف المهم بين مفاهيم الخلط والميراث ، في أنه لا يزال بإمكان [1]الصنف الفرعي أن يرث جميع ميزات الصنف الاصل parent class، ولكن، الدلالات عن الفرع "كونه نوعًا""being a kind of" من الاصل parentلا تحتاج بالضرورة إلى تطبيقها.
مزايا
- إنه يوفر آلية للميراث المتعدد من خلال السماح لفئات متعددة باستخدام الوظيفة المشتركة، ولكن بدون الدلالات المعقدة للوراثة المتعددة. [7]
- قابلية إعادة استخدام الكود : تكون Mixins مفيدة عندما يرغب المبرمج في مشاركة الوظائف بين الفئات المختلفة. بدلاً من تكرار نفس الرمز مرارًا وتكرارًا، يمكن ببساطة تجميع الوظيفة المشتركة في mixin ثم تضمينها في كل فئة تتطلب ذلك. [8]
- يسمح Mixins بالوراثة واستخدام الميزات المطلوبة فقط من الفئة الرئيسية، وليس بالضرورة جميع الميزات من الفئة الرئيسية. [9]
تطبيقات
في Simula ، يتم تعريف classes في block يتم فيها تحديد السماتattributes و methods و class initialization معًا ؛ وبالتالي يتم تعريف جميع الmethods التي يمكن استدعاؤها في فئة معًا، ويتم استكمال تعريفdefined الصنف class .
في Flavours ، المزيجmixin هو class يمكن أن يرث من class اخر ال slot definitions and methods. لا يحتوي الخليط mixin عادة على كائنات مباشرةdirect instances. بما أن Flavor يمكن أن ترث من أكثر من Flavor أخرى، يمكن أن ترث من واحد أو أكثر من mixins. لاحظ أن Flavors الأصلية لم تستخدم وظائف عامةgeneric functions..
في Flavors الجديدة (خليفة النكهات) و CLOS ، يتم تنظيم الأساليب في " وظائف عامة ""generic functions". هذه الدوال العامةgeneric functions هي وظائف يتم تعريفها في حالات (methods) متعددة عن طريق class dispatch و method combinations.
CLOS و Flavours تسمح mixin methods بإضافة سلوك methodsالحالية :before
و :after
،اdaemons الهوامش whoppers والأغلفةwrappers wrapper or a whopper في Flavors. تمت إضافة CLOS :around
methods والقدرة على استدعاء الطرق المظللة shadowed methods عبر CALL-NEXT-METHOD
. لذلك، على سبيل المثال، يمكن أن يضيف دفق قفل mixin قفلًاstream-lock-mixin حول methods الحالية classstream . في Flavours ، يمكن للمرء أن يكتب غلافًا أو ووبرًا وفي CLOS سيستخدم طريقة :around
. يسمح كل من CLOS و Flavours بإعادة الاستخدام المحوسب من خلال تركيبات الطريقة. :before
و :after
و :around
method هي ميزة لمجموعة الطرق القياسية. يتم توفير تركيبات طريقة أخرى.
مثال على ذلك هو مزيج +
الطريقة، حيث يتم إضافة القيم الناتجة لكل من الأساليب القابلة للتطبيق لوظيفة عامة حسابيًا لحساب القيمة المرتجعة. يتم استخدام هذا، على سبيل المثال، مع mixin mixin للكائنات الرسومية. قد يكون للكائن الرسومي دالة عرض عامة. سيضيف mixin الحد إطارًا حول كائن ولديه طريقة حساب عرضه. سيحدد bordered-button
جديد bordered-button
border
حدية للفئة (وهو عبارة عن كائن رسومي ويستخدم مزيج border
) عرضه عن طريق استدعاء جميع طرق العرض القابلة للتطبيق عبر تركيبة +
الطريقة. تتم إضافة جميع قيم الإرجاع وإنشاء العرض المدمج للكائن.
في ورقة OOPSLA 90 ، [10] يعيد كل من جلعاد براخا وويليام كوك تفسير آليات الميراث المختلفة الموجودة في Smalltalk و Beta و CLOS كأشكال خاصة من ميراث المزج.
لغات البرمجة التي تستخدم mixins
بخلاف Flavours و CLOS (جزء من Common Lisp ) ، بعض اللغات التي تستخدم mixins هي:
- Ada (من خلال توسيع سجل موجود بعلامات مع عمليات عشوائية في عام)
- Cobra
- ColdFusion (يعتمد على الفئة باستخدام ويشمل والكائن عن طريق تعيين الأساليب من كائن إلى آخر في وقت التشغيل)
- Curl (مع Curl RTE)
- D (يسمى "mixins template" ؛ يتضمن D أيضًا عبارة "mixin" التي تجمع السلاسل ككود. )
- سهم Dart
- Factor [11]
- رائع
- تفويض JavaScript - الوظائف كأدوار (السمات و Mixins)
- Kotlin
- less
- OCaml
- Perl (من خلال الأدوار في امتداد Moose لنظام كائن Perl 5)
- سمات " PHP "
- Magik
- بايثون
- Racket( وثائق ميكسين )
- Raku
- روبي
- سكالا [12]
- XOTcl / TclOO (نظم الكائن المضمن إلى تى سى ال ) [13]
- sass(لغة ورقة أنماط)
- حديث قصير
- فالا
- سويفت
- SystemVerilog
- TypeScript ( وثائق mixins )
لا تدعم بعض اللغات mixins على مستوى اللغة، ولكن يمكن بسهولة تقليدها عن طريق نسخ الطرق من كائن إلى آخر في وقت التشغيل، وبالتالي "استعارة" طرق mixin. هذا ممكن أيضًا مع اللغات المكتوبة بشكل ثابت ، ولكنه يتطلب إنشاء كائن جديد مع مجموعة موسعة من الأساليب.
يمكن للغات الأخرى التي لا تدعم mixins دعمها بطريقة مستديرة عبر تركيبات لغة أخرى. C # و Visual Basic. يدعم NET إضافة طرق التمديد على الواجهات، مما يعني أن أي فئة تطبق واجهة مع طرق التمديد المحددة سيكون لها طرق التمديد المتاحة كأعضاء زائفين.
أمثلة
في Common Lisp
يوفر Common Lisp مزيجًا في CLOS (نظام كائن Lisp المشترك) مشابهًا للنكهات.
object-width
هو دالة عامة مع وسيطة واحدة تستخدم تركيبة طريقة +
. تحدد هذه التركيبة أنه سيتم استدعاء جميع الطرق القابلة للتطبيق لوظيفة عامة وستتم إضافة النتائج.
(defgeneric object-width (object) (:method-combination +))
button
فئة مع فتحة واحدة لنص الزر.
(defclass button () ((text :initform "click me")))
هناك طريقة لكائنات زر الفئة التي تحسب العرض بناءً على طول نص الزر. +
هو مؤهل الطريقة لمجموعة الطريقة التي تحمل نفس الاسم.
(defmethod object-width + ((object button)) (* 10 (length (slot-value object 'text))))
فئة border-mixin
. التسمية مجرد اتفاقية. لا توجد فائقين، ولا فتحات.
(defclass border-mixin () ())
هناك طريقة لحساب عرض الحدود. هنا فقط 4.
(defmethod object-width + ((object border-mixin)) 4)
bordered-button
هي فئة يرث من كل من border-mixin
و button
.
(defclass bordered-button (border-mixin button) ())
يمكننا الآن حساب عرض الزر. استدعاء object-width
يحسب 80. والنتيجة هي نتيجة الطريقة المنطبقة الوحيدة: طريقة object-width
button
الفئة.
? (object-width (make-instance 'button)) 80
يمكننا أيضًا حساب عرض bordered-button
. استدعاء object-width
يحسب 84. والنتيجة هي مجموع نتائج الطريقتين الساريتين: object-width
الأسلوب button
الفئة وعرض object-width
الأسلوب border-mixin
الفئة.
84 ? (object-width (make-instance 'bordered-button))
في بيثون
في بيثون ، و SocketServer
حدة [14] لديه على حد سواء UDPServer
الطبقة و TCPServer
الصف. تعمل كخوادم لخوادم UDP و TCP socket ، على التوالي. بالإضافة إلى ذلك، هناك فئتان من mixin: ForkingMixIn
و ThreadingMixIn
. عادة، يتم التعامل مع جميع الاتصالات الجديدة في نفس العملية. عن طريق توسيع TCPServer
باستخدام ThreadingMixIn
كما يلي:
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
تضيف فئة ThreadingMixIn
وظائف إلى خادم TCP بحيث يقوم كل اتصال جديد بإنشاء مؤشر ترابط جديد. باستخدام نفس الطريقة، يمكن إنشاء ThreadingUDPServer
دون الحاجة إلى تكرار التعليمات البرمجية في ThreadingMixIn
. وبدلاً من ذلك، فإن استخدام ForkingMixIn
سيؤدي إلى تفرع العملية لكل اتصال جديد. من الواضح أن وظيفة إنشاء خيط جديد أو شوكة عملية ليست مفيدة بشكل كبير كفئة مستقلة.
في مثال الاستخدام هذا، توفر المزج وظائف أساسية بديلة دون التأثير على الوظيفة كخادم مأخذ.
في روبي
يعتمد معظم عالم روبي على مزيج من خلال Modules
. يتم تطبيق مفهوم mixins في Ruby من خلال include
الكلمة الرئيسية التي نمرر عليها اسم الوحدة كمعلمة .
مثال:
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 # Here's the comparison operator. We compare 2 student instances based on their scores. def <=>(other) @score <=> other.score end # Here's the good bit - I get access to <, <=, >,>= and other methods of the Comparable Interface for free. end s1 = Student.new("Peter", 100) s2 = Student.new("Jason", 90) s1 > s2 #true s1 <= s2 #false
في JavaScript
الكائن الحرفي extend
النهج | The Object-Literal and extend
Approach
من الممكن تقنيًا إضافة سلوك إلى كائن من خلال ربطbinding الوظائف بالمفاتيح الموجودة في الكائنobject . ومع ذلك، فإن عدم الفصل بين الحالة والسلوك له عيوب:
- يخلط خصائص مجال النموذجmodel domain مع مجال التطبيقimplementation domain.
- عدم مشاركة السلوك المشترك. تقوم Metaobjects بحل هذه المشكلة عن طريق فصل خصائص المجال domain المحددة للكائنات عن خصائصها الخاصة بسلوكها. [15]
يتم استخدام دالة التمديدextend function لخلط السلوك في: [16]
'use strict'; const Halfling = function (fName, lName) { this.firstName = fName; this.lastName = lName; }; const mixin = { fullName() { return this.firstName + ' ' + this.lastName; }, rename(first, last) { this.firstName = first; this.lastName = last; return this; } }; // An extend function const extend = (obj, mixin) => { Object.keys(mixin).forEach(key => obj[key] = mixin[key]); return obj; }; const sam = new Halfling('Sam', 'Loawry'); const frodo = new Halfling('Freeda', 'Baggs'); // Mixin the other methods extend(Halfling.prototype, mixin); console.log(sam.fullName()); // Sam Loawry console.log(frodo.fullName()); // Freeda Baggs sam.rename('Samwise', 'Gamgee'); frodo.rename('Frodo', 'Baggins'); console.log(sam.fullName()); // Samwise Gamgee console.log(frodo.fullName()); // Frodo Baggins
امزج Mixin باستخدام ()Object.assign
'use strict'; // Creating an object const obj1 = { name: 'Marcus Aurelius', city: 'Rome', born: '121-04-26' }; // Mixin 1 const mix1 = { toString() { return `${this.name} was born in ${this.city} in ${this.born}`; }, age() { const year = new Date().getFullYear(); const born = new Date(this.born).getFullYear(); return year - born; } }; // Mixin 2 const mix2 = { toString() { return `${this.name} - ${this.city} - ${this.born}`; } }; // Adding the methods from mixins to the object using Object.assign() Object.assign(obj1, mix1, mix2); console.log(obj1.toString()); // Marcus Aurelius - Rome - 121-04-26 console.log(`His age is ${obj1.age()} as of today`); // His age is 1897 as of today
الوظيفة النقية والتفويض القائم على نهج خلط الطيران Flight-Mixin
على الرغم من أن النهج الموصوف أولاً منتشر في الغالب، فإن النهج التالي أقرب إلى ما يقدمه جوهر لغة جافا سكريبت بشكل أساسي - التفويض .
هناك نوعان من أنماط الوظائف الوظيفية يقومان بالفعل بالخدعة دون الحاجة إلى تنفيذ طرف ثالث extend
.
'use strict'; // Implementation const EnumerableFirstLast = (function () { // function based module pattern. const first = function () { return this[0]؛ }, last = function () { return this[this.length - 1]؛ }; return function () { // function based Flight-Mixin mechanics ... this.first = first; // ... referring to ... this.last = last; // ... shared code. }; }()); // Application - explicit delegation: // applying [first] and [last] enumerable behavior onto [Array]'s [prototype]. EnumerableFirstLast.call(Array.prototype); // Now you can do: const a = [1, 2, 3]؛ a.first(); // 1 a.last(); // 3
بلغات أخرى
في لغة محتوى الويب Curl ، يتم استخدام الوراثة المتعددة كاصناف classes مع عدم وجود كائنات قد تنفذ طرقًاmethods. وتشمل mixins المشتركة عن سكينبل ControlUI
الصورة وراثة من SkinnableControlUI
، وكائنات واجهة المستخدم المفوضuser interface delegate التي تتطلب القوائم المنسدلةdropdown menus وراثة من StandardBaseDropdownUI classوهذا اسمه صراحة خلطmixin كما FontGraphicMixin
، FontVisualMixin
و NumericAxisMixin-of
الاصناف classes. أضاف الإصدار 7.0 إمكانية الوصول إلى المكتبة بحيث لا يحتاج المزيج إلى أن يكون في نفس الحزمة أو أن يكون مجرد ملخص عام. يُعد مُنشئو التمويجات المصانع التي تسهل استخدام الوراثة المتعددة multiple-inheritanceدون التصريح الصريح interfaces or mixinsبالواجهات أو الخلطات.
الواجهات والسمات
تقدم Java 8 ميزة جديدة في شكل طرق افتراضية للواجهاتdefault methods for interfaces. [17] بشكل أساسي، يسمح بتعريف طريقة method في واجهةinterface مع تطبيق في السيناريو عند إضافة طريقةطريقةmethod جديدة إلى واجهةinterface بعد الانتهاء من إعداد برمجة صنف الواجهة interface class. إن إضافة وظيفة جديدة إلى الواجهة تعني تنفيذ الطريقة method في كل صنف class تستخدم الواجهةinterface . تساعد الطرق الافتراضية Default methods في هذه الحالة حيث يمكن تقديمها إلى واجهة interface في أي وقت ولها بنية منفذة يتم استخدامها بعد ذلك من قبل الاصناف المرتبطةassociated classes. ومن ثم تضيف الطرق الافتراضية default methodsإمكانية لتطبيق المفهوم بطريقة من النوع المختلطmixin .
يمكن للواجهاتInterfaces المدمجة مع البرمجة الموجهة إلى الجوانب أن تنتج أيضًا مزيجًا متكاملًا باللغات التي تدعم هذه الميزات، مثل C # أو Java. بالإضافة إلى ذلك، من خلال استخدام نمط واجهة العلامة والبرمجة العامة marker interface pattern, generic programming,وطرق التمديدextension methods ، فإن C # 3.0 لديه القدرة على محاكاة الخلطات. مع الإصدار 3.0 من C # ، تم تقديم طرق التمديدExtension Methods [2] ويمكن تطبيقها، ليس فقط على الاصناف classes ولكن أيضًا على الواجهاتclasses. توفر طرق التمديدExtension Methods وظائف إضافية في فصل دراسي موجود بدون تعديل الصنف. ثم يصبح من الممكن إنشاء فئة مساعد ثابتة static helper classلوظائف محددة تحدد طرق التمديدextension methods. نظرًا لأن الاصناف تطبق الواجهة (حتى إذا لم تحتوي الواجهة الفعلية على أي طرق أو خصائص لتطبيقها) ، فستلتقط جميع طرق الامتداد أيضًا. [3] [4] [18]
لا يحتاج ECMAScript (في معظم الحالات التي يتم تنفيذها كجافا سكريبت) إلى محاكاة تكوين الكائن عن طريق نسخ الحقول تدريجيًا من كائن إلى آخر. وهو [19] يدعم في الأساس خاصية Trait و mixin [20] [21] تعتمد على تكوين العناصر عبر الكائنات الوظيفية التي تنفذ سلوكًا إضافيًا ثم يتم تفويضها عبر call
أو apply
على الكائنات التي تحتاج إلى مثل هذه الوظائف الجديدة.
في سكالا
سكالا لديها نظام غني من النوع والسماتtype system and Traits جزء منه مما يساعد على تنفيذ سلوك الخلطmixin . كما يظهر اسمها، يتم استخدام Traits السمات عادة لتمثيل ميزة أو سمة مميزة عادة ما تكون متعامدة مع مسؤولية نوع ملموس أو على الأقل في حالة معينة. [22] على سبيل المثال، تم تصميم القدرة على الغناء على أنها سمة متعامدة: يمكن تطبيقها على الطيور والأشخاص وما إلى ذلك.
trait Singer{ def sing { println(" singing … ") } //more methods } class Bird extends Singer
هنا، اختلط Bird في جميع طرقmethods السمةtrait في تعريفه الخاص كما لو كانت صنف Bird قد حددت طريقة الغناء () بمفردها.
كما extends
يستخدم أيضا ليرث من صنفsuper class ، إذا لم يرق اي صنف superclass في حالة استخدام trait سمة extends
وفقط لmixin في سمة traitالأولى. يتم خلط جميع السمات التالية في استخدام الكلمة الأساسية with
.
class Person class Actor extends Person with Singer class Actor extends Singer with Performer
Scala يسمح بالاختلاط في سمة trait (إنشاء نوع مجهول) عند إنشاء كائن جديد لصنف instance of a class. في حالة كائن من صنف الشخص، لا يمكن لجميع الكائنات الغناءsing. هذه الميزة تأتي ثم استخدام:
class Person{ def tell { println (" Human ") } //more methods } val singingPerson = new Person with Singer singingPerson.sing
في سويفت Swift
يمكن تحقيق Mixin في Swift باستخدام ميزة لغة تسمى التنفيذ الافتراضي في ملحق البروتوكولProtocol Extension.
1 protocol ErrorDisplayable { 2 func error(message:String) 3 } 4 5 extension ErrorDisplayable { 6 func error(message:String) { 7 // Do what it needs to show an error 8 //... 9 print(message) 10 } 11 } 12 13 struct NetworkManager : ErrorDisplayable { 14 func onError() { 15 error("Please check your internet Connection.") 16 } 17 }
مقالات ذات صلة
- نوع مجرد
- نمط الديكور
- التصميم القائم على السياسة
- سمة، بنية مماثلة لا تتطلب تكوينًا خطيًا
المراجع
- Using Mix-ins with Python - تصفح: نسخة محفوظة 2019-08-13 على موقع واي باك مشين.
- Mix-Ins (Steve's ice cream, Boston, 1975) - تصفح: نسخة محفوظة 2007-10-26 على موقع واي باك مشين.
- Implementing Mix-ins with C# Extension Methods - تصفح: نسخة محفوظة 2017-07-09 على موقع واي باك مشين.
- I know the answer (it's 42) : Mix-ins and C# - تصفح: نسخة محفوظة 2009-12-15 على موقع واي باك مشين.
- Boyland, John; Giuseppe Castagna (26 June 1996). "Type-Safe Compilation of Covariant Specialization: A Practical Case". In Pierre Cointe (المحرر). ECOOP '96, Object-oriented Programming: 10th European Conference. Springer. صفحات 16–17. . مؤرشف من الأصل في 26 أبريل 202017 يناير 2014.
- http://c2.com/cgi/wiki?MixIn - تصفح: نسخة محفوظة 2016-07-09 على موقع واي باك مشين.
- "Working with Mixins in Ruby" (باللغة الإنجليزية). مؤرشف من الأصل في 15 أبريل 201826 أبريل 2020.
- "Re-use in OO: Inheritance, Composition and Mixins - naildrivin5.com - David Bryant Copeland's Website". مؤرشف من الأصل في 28 يناير 201826 أبريل 2020.
- "Archived copy". مؤرشف من الأصل في 25 سبتمبر 201516 سبتمبر 2015.
- OOPSLA '90, Mixin based inheritance (pdf) - تصفح: نسخة محفوظة 2019-02-14 على موقع واي باك مشين.
- slava (2010-01-25). "Factor/Features/The language". concatenative.org. مؤرشف من الأصل في 17 مارس 202015 مايو 2012.
Factor's main language features: … Object system with Inheritance, Generic functions, Predicate dispatch and Mixins
- "Mixin Class Composition". مدرسة لوزان الاتحادية للفنون التطبيقية. مؤرشف من الأصل في 26 يوليو 201916 مايو 2014.
- Mixin classes in XOTcl - تصفح: نسخة محفوظة 2019-01-02 على موقع واي باك مشين.
- Source code for SocketServer in CPython 3.5 - تصفح: نسخة محفوظة 2015-10-24 على موقع واي باك مشين.
- "Mixins, Forwarding, and Delegation in JavaScript". مؤرشف من الأصل في 21 أكتوبر 201926 أبريل 2020.
- "Archived copy". مؤرشف من الأصل في 21 سبتمبر 201516 سبتمبر 2015.
- "Default Methods (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)". مؤرشف من الأصل في 19 أكتوبر 201926 أبريل 2020.
- Mixins, generics and extension methods in C# - تصفح: نسخة محفوظة 2018-03-03 على موقع واي باك مشين.
- The many talents of JavaScript for generalizing Role Oriented Programming approaches like Traits and Mixins, April 11, 2014. نسخة محفوظة 2017-10-05 على موقع واي باك مشين.
- Angus Croll, A fresh look at JavaScript Mixins, published May 31, 2011. نسخة محفوظة 2020-04-15 على موقع واي باك مشين.
- JavaScript Code Reuse Patterns, April 19, 2013. نسخة محفوظة 2020-04-26 على موقع واي باك مشين.
- "Scala in practice: Traits as Mixins – Motivation" (باللغة الإنجليزية). مؤرشف من الأصل في 27 يوليو 201726 أبريل 2020.
روابط خارجية
- MixIn في مستودع نمط بورتلاند
- Mixins في ActionScript
- يوفر نظام الكائن المشترك Lisp: نظرة عامة بقلم ريتشارد ب.غابرييل وليندا ديميشيل مقدمة جيدة للدافع لتحديد الفئات عن طريق الوظائف العامة.