ميكسين

في لغات البرمجة الموجهة للكائنات ، يُعد المزيج (أو المزيج الداخلي ) [1] [2] [3] [4] فئة تحتوي على طرق لاستخدامها بواسطة فئات أخرى دون الحاجة إلى أن تكون الفئة الأصلية لتلك الفئات الأخرى. تعتمد كيفية وصول الفئات الأخرى إلى طرق المزيج على اللغة. يتم وصف المزيج أحيانًا بأنه "مضمن" بدلاً من "موروث".

تشجع الخلطات إعادة استخدام الكود ويمكن استخدامها لتجنب غموض الميراث الذي يمكن أن يسببه الميراث المتعدد [5] (" مشكلة الماس ")، أو للتغلب على نقص الدعم للميراث المتعدد في لغة ما. يمكن أيضًا اعتبار الخلطة واجهة مع الأساليب المطبقة . هذا النمط هو مثال على فرض مبدأ عكس التبعية .

تاريخ

ظهرت Mixins لأول مرة في نظام Flavors الموجه للكائنات من Symbolics (الذي طوره Howard Cannon)، والذي كان نهجًا للتوجيه الكائني المستخدم في Lisp Machine Lisp . استوحي الاسم من متجر الآيس كريم Steve's Ice Cream Parlor في سومرفيل، ماساتشوستس: [1] عرض مالك متجر الآيس كريم نكهة أساسية من الآيس كريم (فانيليا، شوكولاتة، إلخ) ومزجها بمزيج من العناصر الإضافية (المكسرات، البسكويت، الفدج، إلخ) وأطلق على العنصر اسم " mix-in "، وهو مصطلح مسجل باسمه في ذلك الوقت. [2]

تعريف

Mixins هو مفهوم لغوي يسمح للمبرمج بحقن بعض التعليمات البرمجية في فئة . برمجة Mixin هي أسلوب من أساليب تطوير البرمجيات ، حيث يتم إنشاء وحدات وظيفية في فئة ثم يتم خلطها مع فئات أخرى. [6]

تعمل فئة المزيج كفئة رئيسية تحتوي على الوظيفة المطلوبة. يمكن للفئة الفرعية بعد ذلك أن ترث أو تعيد استخدام هذه الوظيفة ببساطة، ولكن ليس كوسيلة للتخصص. عادةً، ستصدر المجموعة المختلطة الوظيفة المطلوبة إلى فئة فرعية ، دون إنشاء علاقة "is a" جامدة واحدة. هنا يكمن الاختلاف المهم بين مفهومي المزيج والميراث ، حيث لا يزال بإمكان الفئة الفرعية أن ترث جميع ميزات الفئة الرئيسية، ولكن الدلالات حول كون الطفل "نوعًا من" الفئة الرئيسية لا يجب بالضرورة تطبيقها.

المزايا

  1. إنه يوفر آلية للوراثة المتعددة من خلال السماح لفئة واحدة باستخدام وظائف مشتركة من فئات متعددة، ولكن بدون الدلالات المعقدة للوراثة المتعددة. [7]
  2. إمكانية إعادة استخدام الكود : تعتبر الخلطات مفيدة عندما يرغب المبرمج في مشاركة الوظائف بين فئات مختلفة. فبدلاً من تكرار نفس الكود مرارًا وتكرارًا، يمكن ببساطة تجميع الوظائف المشتركة في خلطة ثم تضمينها في كل فئة تتطلبها. [8]
  3. تسمح Mixins بالوراثة واستخدام الميزات المطلوبة فقط من الفئة الأصلية، وليس بالضرورة جميع الميزات من الفئة الأصلية. [9]

التنفيذات

في Simula ، يتم تعريف الفئات في كتلة يتم فيها تعريف السمات والطرق وتهيئة الفئة معًا؛ وبالتالي يتم تعريف جميع الطرق التي يمكن استدعاؤها في فئة معًا، ويصبح تعريف الفئة كاملاً.

في Flavors ، يعد المزيج فئة يمكن لفئة أخرى أن ترث منها تعريفات وأساليب الفتحات. لا يحتوي المزيج عادةً على مثيلات مباشرة. نظرًا لأن Flavor يمكن أن يرث من أكثر من Flavor أخرى، فيمكنه أن يرث من مزيج واحد أو أكثر. لاحظ أن Flavors الأصلية لم تستخدم وظائف عامة.

في New Flavors (خليفة Flavors) و CLOS ، يتم تنظيم الأساليب في " وظائف عامة ". هذه الوظائف العامة هي وظائف يتم تعريفها في حالات متعددة (طرق) من خلال مجموعات الإرسال والطرق الخاصة بالفئة.

تسمح CLOS وFlavors لطرق mixin بإضافة سلوك إلى الطرق الموجودة: :beforeو :afterdaemons وwhoppers وwrappers في Flavors. أضافت CLOS :aroundطرقًا والقدرة على استدعاء طرق مظللة عبر CALL-NEXT-METHOD. لذا، على سبيل المثال، يمكن لمزيج قفل التدفق إضافة قفل حول الطرق الموجودة لفئة التدفق. في Flavors، يكتب المرء غلافًا أو whopper وفي CLOS، يستخدم المرء :aroundطريقة. يسمح كل من CLOS وFlavors بإعادة الاستخدام المحسوبة عبر مجموعات الطرق. و :before، والطرق هي ميزة لمجموعة الطرق القياسية. يتم توفير مجموعات طرق أخرى. :after:around

من الأمثلة على ذلك +تركيبة الطريقة، حيث تتم إضافة القيم الناتجة لكل من الطرق القابلة للتطبيق لوظيفة عامة حسابيًا لحساب قيمة الإرجاع. يتم استخدام هذا، على سبيل المثال، مع border-mixin للكائنات الرسومية. قد يكون للكائن الرسومي دالة عرض عامة. ستضيف border-mixin حدًا حول الكائن ولديها طريقة لحساب عرضه. ستحسب الفئة الجديدة bordered-button(التي هي كائن رسومي وتستخدم bordermixin) عرضها عن طريق استدعاء جميع طرق العرض القابلة للتطبيق - عبر +تركيبة الطريقة. تتم إضافة جميع قيم الإرجاع وإنشاء العرض المجمع للكائن.

في ورقة OOPSLA 90، [10] أعاد جيلاد براشا وويليام كوك تفسير آليات الوراثة المختلفة الموجودة في Smalltalk وBeta وCLOS كأشكال خاصة من وراثة المزيج.

لغات البرمجة التي تستخدم mixins

بخلاف Flavors وCLOS (جزء من Common Lisp )، بعض اللغات التي تستخدم mixins هي:

لا تدعم بعض اللغات المزج على مستوى اللغة، ولكن يمكنها تقليدها بسهولة عن طريق نسخ الأساليب من كائن إلى آخر في وقت التشغيل، وبالتالي "استعارة" أساليب المزج. وهذا ممكن أيضًا مع اللغات ذات النوع الثابت ، ولكنه يتطلب إنشاء كائن جديد بمجموعة ممتدة من الأساليب.

يمكن للغات الأخرى التي لا تدعم المزيجات أن تدعمها بطريقة غير مباشرة من خلال هياكل لغوية أخرى. على سبيل المثال، تدعم Visual Basic .NET وC# إضافة طرق التمديد على الواجهات، مما يعني أن أي فئة تنفذ واجهة مع طرق توسعة محددة ستتوفر لها طرق التوسيع كأعضاء وهمية.

أمثلة

في لغة ليسب الشائعة

يوفر Common Lisp مزيجًا في CLOS (نظام كائنات Common Lisp) مشابهًا للنكهات.

object-widthهي دالة عامة ذات وسيطة واحدة تستخدم +تركيبة الطريقة. تحدد هذه التركيبة أنه سيتم استدعاء جميع الطرق القابلة للتطبيق لدالة عامة وإضافة النتائج.

( عرض الكائن العام ( الكائن ) ( :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 فقط.

( طريقة تعريف عرض الكائن + (( مزيج حدود الكائن )) 4 )    
  

bordered-buttonهي فئة موروثة من كل من border-mixinو button.

( defclass bordered-button ( border-mixin button ) ())    

يمكننا الآن حساب عرض الزر. object-widthيؤدي الاستدعاء إلى حساب 80. والنتيجة هي نتيجة الطريقة الوحيدة القابلة للتطبيق: الطريقة object-widthالخاصة بالفئة button.

؟ ( عرض الكائن ( صنع مثيل 'زر )) 80   

يمكننا أيضًا حساب عرض a bordered-button. يحسب الاستدعاء object-width84. النتيجة هي مجموع نتائج الطريقتين المطبقتين: الطريقة object-widthالخاصة بالفئة buttonوالطريقة object-widthالخاصة بالفئة border-mixin.

؟ ( عرض الكائن ( إنشاء مثيل 'زر محدد )) 84   

في بايثون

في بايثون ، يوجد مثال لمفهوم المزيج في SocketServerالوحدة النمطية [17]، والتي تحتوي على كل من UDPServerفئة TCPServerوفئة. تعمل كخوادم لخوادم مآخذ UDP و TCP على التوالي. بالإضافة إلى ذلك، هناك فئتان من المزيج: ForkingMixInو ThreadingMixIn. عادةً، تتم معالجة جميع الاتصالات الجديدة ضمن نفس العملية. من خلال التوسيع TCPServerباستخدام ThreadingMixInعلى النحو التالي:

الفئة  ThreadingTCPServer ( ThreadingMixIn ،  TCPServer ): 
    تمرير

تضيف الفئة ThreadingMixInوظائف إلى خادم TCP بحيث ينشئ كل اتصال جديد خيطًا جديدًا . باستخدام نفس الطريقة، ThreadingUDPServerيمكن إنشاء a دون الحاجة إلى تكرار الكود في ThreadingMixIn. بدلاً من ذلك، ForkingMixInقد يؤدي استخدام a إلى تقسيم العملية لكل اتصال جديد. من الواضح أن الوظيفة لإنشاء خيط جديد أو تقسيم عملية ليست مفيدة للغاية كفئة مستقلة.

في مثال الاستخدام هذا، توفر المجموعات المختلطة وظائف أساسية بديلة دون التأثير على الوظيفة كخادم مقبس.

في روبي

يعتمد معظم عالم Ruby على mixins عبر Modules. يتم تنفيذ مفهوم mixins في Ruby من خلال الكلمة الأساسية includeالتي نمرر إليها اسم الوحدة النمطية كمعلمة .

مثال:

class Student include Comparable # ترث class Student وحدة Comparable باستخدام الكلمة الأساسية 'include' attr_accessor :name , :score 
    
    

  def initialize ( name , score ) @name = name @score = score end  
      
      
  

  # يتطلب تضمين وحدة Comparable من الفئة المنفذة تعريف عامل المقارنة <=> 
# إليك عامل المقارنة. نقارن بين حالتين للطلاب بناءً على درجاتهما.  

  def <=> ( other ) @score <=> other . score نهاية 
      
  

  # هذا هو الجزء الجيد - أحصل على إمكانية الوصول إلى <، <=، >،>= وطرق أخرى لواجهة المقارنة مجانًا. 
النهاية

s1 = طالب جديد ( "بيتر" ، 100 ) s2 = طالب جديد ( " جيسون " ، 90 )   
   

s1 > s2 #صحيح s1 <= s2 #خطأ   
   

في جافا سكريبت

المفعول به extendوالنهج

من الناحية الفنية، من الممكن إضافة سلوك إلى كائن ما عن طريق ربط الوظائف بالمفاتيح الموجودة في الكائن. ومع ذلك، فإن هذا الافتقار إلى الفصل بين الحالة والسلوك له عيوب:

  1. يختلط فيه خصائص مجال النموذج مع خصائص مجال التنفيذ.
  2. لا توجد مشاركة للسلوك المشترك. تحل الكائنات الفوقية هذه المشكلة عن طريق فصل خصائص المجال الخاصة بالكائنات عن خصائص سلوكها الخاصة. [18]

يتم استخدام دالة التمديد لخلط السلوك في: [19]

'استخدم صارمًا' ؛

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 ; } } ;   
   
         
  
    
      
      
     
  


// دالة تمديد 
const extend = ( obj , mixin ) => { Object . keys ( mixin ). forEach ( key => obj [ key ] = mixin [ key ]); return obj ; };      
      
   


const sam = نصف إنسان جديد ( 'Sam' ، 'Loawry' const frodo = نصف إنسان جديد ( 'Freeda' ، 'Baggs'      
     

// قم بخلط الطرق الأخرى 
extend ( Halfling .prototype , mixin ) ; 

console . log ( sam . fullName ()); // Sam Loawry console . log ( frodo . fullName ()); // Freeda Baggs  
  

سام . إعادة تسمية ( 'ساموايز' ، 'جامجي' فرودو . إعادة تسمية ( 'فرودو' ، 'باغينز'  
 

console . log ( sam . fullName ()); // Samwise Gamgee console . log ( frodo . fullName ()); // Frodo Baggins  
  

المزج باستخدام Object.assign()

'استخدم صارمًا' ؛

// إنشاء كائن 
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 } ` ; } } ;   
   
     
  
   
        
        
       
  


   
   
     
  


// إضافة الأساليب من mixins إلى الكائن باستخدام Object.assign() 
Object . assign ( obj1 ، mix1 ، mix2   

console.log ( obj1.toString ( ) ); // ماركوس أوريليوس - روما - 121-04-26 console.log ( `عمره هو ${ obj1.age () } اعتبارًا من اليوم` ); // عمره هو 1897 اعتبارًا من اليوم   
  

نهج Flight-Mixin القائم على الوظيفة الصرفة والتفويض

على الرغم من أن النهج الموصوف أولاً منتشر على نطاق واسع، إلا أن النهج التالي أقرب إلى ما يقدمه جوهر لغة JavaScript بشكل أساسي - التفويض .

يؤدي نمطا الكائن الوظيفي القائمان على الوظيفتين المهمة بالفعل دون الحاجة إلى تنفيذ طرف ثالث لـ extend.

'استخدم صارمًا' ؛

// التنفيذ 
const EnumerableFirstLast = ( function () { // نمط الوحدة النمطية المستندة إلى الدالة. const first = function () { return this [ 0 ]; }, last = function () { return this [ this . length - 1 ]; }; return function () { // ميكانيكا Flight-Mixin المستندة إلى الدالة ... this . first = first ; // ... الإشارة إلى ... this . last = last ; // ... الكود المشترك. }; }());      
       
       
    
        
         
    
           
         
           
  


// التطبيق - التفويض الصريح: 
// تطبيق سلوك العد [الأول] و[الأخير] على [النموذج الأولي] لـ [Array]. 
EnumerableFirstLast . call ( Array . prototype );

// الآن يمكنك القيام بما يلي: 
const a = [ 1 , 2 , 3 ]; a . first (); // 1 a . last (); // 3     
 
  

بلغات أخرى

في لغة محتوى الويب Curl ، يتم استخدام الوراثة المتعددة حيث يمكن للفئات التي لا تحتوي على مثيلات تنفيذ الأساليب. تتضمن المجموعات المختلطة الشائعة جميع العناصر القابلة للتخصيص ControlUIs التي ترث من SkinnableControlUI، وكائنات مندوب واجهة المستخدم التي تتطلب قوائم منسدلة ترث من StandardBaseDropdownUI وفئات المجموعات المختلطة المسماة صراحةً مثل FontGraphicMixin، FontVisualMixinو NumericAxisMixin-ofclass. أضاف الإصدار 7.0 إمكانية الوصول إلى المكتبة بحيث لا يلزم أن تكون المجموعات المختلطة في نفس الحزمة أو أن تكون مجردة عامة. إن منشئي Curl عبارة عن مصانع تسهل استخدام الوراثة المتعددة دون إعلان صريح عن أي من الواجهات أو المجموعات المختلطة. [ بحاجة لمصدر ]

الواجهات والسمات

يقدم Java 8 ميزة جديدة في شكل طرق افتراضية للواجهات. [20] يسمح بشكل أساسي بتعريف طريقة في واجهة مع تطبيق في السيناريو عندما تتم إضافة طريقة جديدة إلى واجهة بعد الانتهاء من إعداد برمجة فئة الواجهة. إن إضافة وظيفة جديدة إلى الواجهة تعني تنفيذ الطريقة في كل فئة تستخدم الواجهة. تساعد الطرق الافتراضية في هذه الحالة حيث يمكن تقديمها إلى واجهة في أي وقت ولديها بنية منفذة يتم استخدامها بعد ذلك بواسطة الفئات المرتبطة. وبالتالي تضيف الطرق الافتراضية القدرة على تطبيق مفهوم المزيج في Java.

يمكن للواجهات المدمجة مع البرمجة الموجهة للجوانب أيضًا إنتاج مزيج كامل في اللغات التي تدعم مثل هذه الميزات، مثل C# أو Java. بالإضافة إلى ذلك، من خلال استخدام نمط واجهة العلامة والبرمجة العامة وطرق التمديد، تتمتع C# 3.0 بالقدرة على محاكاة المزيج. مع Dart 2.7 وC# 3.0 جاء تقديم طرق التمديد التي يمكن تطبيقها، ليس فقط على الفئات، ولكن أيضًا على الواجهات. توفر طرق التمديد وظائف إضافية على فئة موجودة دون تعديل الفئة. ثم يصبح من الممكن إنشاء فئة مساعدة ثابتة لوظيفة معينة تحدد طرق التمديد. نظرًا لأن الفئات تنفذ الواجهة (حتى إذا كانت الواجهة الفعلية لا تحتوي على أي طرق أو خصائص لتنفيذها)، فإنها ستلتقط جميع طرق التمديد أيضًا. [3] [4] [21] يضيف C# 8.0 ميزة طرق الواجهة الافتراضية. [22] [23]

لا يحتاج ECMAScript (الذي يتم تنفيذه في أغلب الحالات كـ JavaScript) إلى محاكاة تكوين الكائنات من خلال نسخ الحقول خطوة بخطوة من كائن إلى آخر. فهو يدعم بشكل أصلي [24] تكوين الكائنات المستند إلى السمات والمزيج [25] [26] من خلال كائنات الوظائف التي تنفذ سلوكًا إضافيًا ثم يتم تفويضها عبر callأو applyإلى الكائنات التي تحتاج إلى مثل هذه الوظيفة الجديدة.

في سكالا

تتمتع لغة سكالا بنظام أنواع غني، وتعد السمات جزءًا منه، مما يساعد في تنفيذ سلوك المزج. وكما يكشف اسمها، تُستخدم السمات عادةً لتمثيل سمة أو جانب مميز يكون عادةً متعامدًا مع مسؤولية نوع ملموس أو على الأقل حالة معينة. [27] على سبيل المثال، يتم تصميم القدرة على الغناء باعتبارها سمة متعامدة: يمكن تطبيقها على الطيور والأشخاص وما إلى ذلك.

السمة المغني { def sing { println ( " الغناء … " ) } // المزيد من الطرق } 
      
  


فئة الطيور تمتد إلى المغني   

هنا، قام Bird بخلط جميع طرق السمة في تعريفه الخاص كما لو كانت الفئة Bird قد قامت بتعريف طريقة sing() بنفسها.

كما extendsيستخدم أيضًا للوراثة من فئة عليا، في حالة وجود سمة extendsيتم استخدامها إذا لم يتم وراثة فئة عليا ويتم استخدامها فقط للخلط في السمة الأولى. يتم خلط جميع السمات التالية باستخدام الكلمة الأساسية with.

الفئة Person الفئة Actor تمتد إلى Person مع Singer الفئة Actor تمتد إلى Singer مع Performer 
     
     

تسمح لغة سكالا بخلط سمة (إنشاء نوع مجهول ) عند إنشاء مثيل جديد لفئة. في حالة وجود مثيل لفئة Person، لا يمكن لجميع المثيلات الغناء. تأتي هذه الميزة بعد ذلك:

الفئة Person { def tell { println ( " Human " ) } // المزيد من الطرق } 
        
  


فال غناء الشخص = شخص جديد مع المغني الغناء الشخص . الغناء      

في الصدأ

يستخدم Rust بشكل مكثف مزيجًا من خلال السمات . تسمح السمات، كما هو الحال في Scala، للمستخدمين بتنفيذ سلوكيات لنوع محدد. تُستخدم أيضًا للأنواع العامة والإرسال الديناميكي ، مما يسمح باستخدام الأنواع التي تنفذ سمة بشكل متبادل بشكل ثابت أو ديناميكي في وقت التشغيل. [28]

// يسمح للأنواع "بالتحدث" 
السمة Speak { fn speak ();  
	 

	// يسمح Rust للمنفذين بتحديد تنفيذات افتراضية للوظائف المحددة في السمات 
fn greeting () { println! ( "Hi!" ) } }	  
		
	


هيكل  الكلب ؛

impl Speak for Dog { fn speak () { println! ( "Woof woof" ); } }    
	  
		
	


هيكل  الروبوت ؛

impl تحدث للروبوت { fn speak () { println! ( "بيب بيب بوب بوب" ); }    
	  
		
	

	// هنا نتجاوز تعريف Speak::greet لـ Robot 
fn greeting () { println! ( "Robot says howdy!" ) } }	  
		
	

في سويفت

يمكن تحقيق Mixin في Swift باستخدام ميزة اللغة المسماة Default implementation في Protocol Extension.

بروتوكول  ErrorDisplayable  {
     خطأ في الدالة ( الرسالة : سلسلة )
}

امتداد  ErrorDisplayable  {
     خطأ في الدالة ( الرسالة : سلسلة )  {
        // افعل ما يلزم لإظهار الخطأ
        //...
        طباعة ( رسالة )
    }
}

هيكل  NetworkManager  :  ErrorDisplayable  {
    دالة  onError ()  {
        خطأ ( "الرجاء التحقق من اتصالك بالإنترنت." )
    }
}

انظر أيضا

مراجع

  1. ^ ab "استخدام Mix-ins مع Python | Linux Journal". www.linuxjournal.com . تم الاسترجاع في 2023-05-23 .
  2. ^ من موقع AOL.COM، Bapopik في (3 أغسطس 2002). "Mix-Ins (آيس كريم ستيف، بوسطن، 1975)" . تم الاسترجاع في 2023-05-23 .
  3. ^ ab "تنفيذ Mixins باستخدام طرق التمديد C#". Zorched / One-Line Fix . تم الاسترجاع في 2023-05-23 .
  4. ^ ab "أعرف الإجابة (إنها 42) : Mixins and C#". 2006-09-04. مؤرشف من الأصل في 2006-09-04 . تم الاسترجاع في 2023-05-23 .
  5. ^ Boyland, John; Giuseppe Castagna (26 June 1996). "Type-Safe Compilation of Covariant Specialization: A Practical Case". في Pierre Cointe (محرر). ECOOP '96, Object-oriented Programming: 10th European Conference . Springer. ص 16-17. ISBN 9783540614395تم الاسترجاع بتاريخ 17 يناير 2014 .
  6. ^ "Mix In". wiki.c2.com . تم الاسترجاع في 2023-05-23 .
  7. ^ "العمل مع Mixins في Ruby". 8 يوليو 2015.
  8. ^ "إعادة الاستخدام في OO: الميراث والتكوين والمزج".
  9. ^ "Moving beyond mixins » Justin Leitgeb". مؤرشف من الأصل في 2015-09-25 . تم استرجاعه في 2015-09-16 .
  10. ^ "الوراثة القائمة على المزيج" (PDF) .
  11. ^ بيل واجنر. "إنشاء أنواع المزيج باستخدام طرق الواجهة الافتراضية". docs.microsoft.com . تم الاسترجاع في 2022-04-18 .
  12. ^ slava (2010-01-25). "Factor/Features/The language". concatenative.org . تم الاسترجاع في 2012-05-15 . السمات الرئيسية للغة Factor: ... نظام الكائنات مع الوراثة، والوظائف العامة، وإرسال المسندات، والمزيجات
  13. ^ "الفصول الدراسية - MATLAB & Simulink - MathWorks India".
  14. ^ Alain Frisch (2013-06-14). "Mixin objects". LexiFi . تم الاسترجاع في 2022-03-29 .
  15. ^ “تكوين فئة ميكسين”. مدرسة البوليتكنيك الفيدرالية في لوزان . تم الاسترجاع 16 مايو 2014 .
  16. ^ "XOTcl - Tutorial". media.wu-wien.ac.at . تم الاسترجاع في 2023-05-23 .
  17. ^ "cpython: 2cb530243943 Lib/socketserver.py". hg.python.org . تم الاسترجاع في 2023-05-23 .
  18. ^ "المزيجات، وإعادة التوجيه، والتفويض في JavaScript".
  19. ^ "DRY JavaScript with mixins". مؤرشف من الأصل في 2015-09-21 . تم الاسترجاع 2015-09-16 .
  20. ^ "الطرق الافتراضية (دروس Java™ > تعلم لغة Java > الواجهات والوراثة)".
  21. ^ Mixins، generics وطرق التمديد في C#
  22. ^ "طرق التمديد". flutterbyexample.com . تم الاسترجاع في 2023-05-23 .
  23. ^ "إنشاء أنواع مزيج باستخدام طرق الواجهة الافتراضية | Microsoft Docs". 2020-04-13. مؤرشف من الأصل في 2020-04-13 . تم الاسترجاع 2023-05-23 .
  24. ^ Seliger, Peter (2014-04-11). "Drehtür: The-many-Talents-of-JavaScript". Drehtür . تم الاسترجاع في 2023-05-23 .
  25. ^ Croll, Angus (2011-05-31). "نظرة جديدة على JavaScript Mixins". JavaScript, JavaScript.. . تم الاسترجاع في 2023-05-23 .
  26. ^ "javascript-code-reuse-patterns/source/components/composition at master · petsel/javascript-code-reuse-patterns". GitHub . تم الاسترجاع في 2023-05-23 .
  27. ^ "سكالا في الممارسة: السمات كمزيج - الدافع". 19 يوليو 2009.
  28. ^ "السمات: تحديد السلوك المشترك - لغة برمجة Rust".
  • MixIn في مستودع أنماط بورتلاند
  • الميكسينز في ActionScript
  • يوفر كتاب "نظام كائنات Common Lisp: نظرة عامة" بقلم ريتشارد ب. غابرييل وليندا دي ميشيل مقدمة جيدة للدافع وراء تعريف الفئات من خلال الوظائف العامة.
تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=Mixin&oldid=1254396320"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate