فئة ميتا

في البرمجة كائنية التوجه ، تُعرَّف الفئة الفوقية بأنها فئة تُستخدم تعريفاتها النحوية لتعريف الفئات نفسها. على عكس الفئات العادية التي تُحدد سلوك الكائنات، تُحدد الفئات الفوقية سلوك الفئات ومثيلاتها. لا تدعم جميع لغات البرمجة كائنية التوجه مفهوم الفئات الفوقية. أما في اللغات التي تدعمه، فيختلف مدى تحكم الفئات الفوقية في سلوك الفئات. غالبًا ما تُطبَّق الفئات الفوقية بمعاملة الفئات كعناصر أساسية ، مما يجعل الفئة الفوقية كائنًا يُنشئ هذه الفئات ويديرها. تلتزم كل لغة برمجة ببروتوكول الكائنات الفوقية الخاص بها ، وهو عبارة عن القواعد التي تُحدد التفاعلات بين الكائنات والفئات والفئات الفوقية. [ 1 ] تُستخدم الفئات الفوقية لأتمتة توليد التعليمات البرمجية وتحسين تطوير الأطر البرمجية. [ 2 ]

مثال بايثون

في لغة بايثون ، تُعتبر الفئة المدمجة typeفئةً فوقية. [ 3 ] [ 4 ] [ 5 ] لنأخذ مثالًا على فئة بايثون البسيطة التالية:

فئة السيارة : الصنع : سلسلة نصية، الموديل : سلسلة نصية، السنة : عدد صحيح، اللون : سلسلة نصيةdef __init __ ( self , make : str , model : str , year : int , color : str ) - > None : self.make = make self.model = model self.year = year self.color = color@property def description ( self ) -> str : """  إرجاع وصف لهذه السيارة.  """ return f " { self . color } { self . make } { self . model } "

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

يحتوي المثال أعلاه على بعض التعليمات البرمجية الزائدة المتعلقة بالسمات الأربع makeو و و . من الممكن التخلص من بعض هذه التعليمات الزائدة باستخدام فئة وصفية مخصصة. في بايثون، تُعرَّف الفئة الوصفية بسهولة كفئة فرعية modelمن .yearcolortype

من typing استورد Anyclass AttributeInitType ( type ): def __call__ ( self , * args : tuple [ Any ], ** kwargs : dict [ str , Any ]) -> object : """  إنشاء نسخة جديدة.  """# أولاً، أنشئ الكائن بالطريقة الافتراضية المعتادة. obj : object = type . __call__ ( self , * args )# بالإضافة إلى ذلك ، قم بتعيين سمات الكائن الجديد. for name , value in kwargs.items ( ): setattr ( obj , name , value )# أعد الكائن الجديد. return obj

لا تقوم هذه الفئة الوصفية إلا بتجاوز عملية إنشاء الكائنات. أما جميع الجوانب الأخرى لسلوك الفئة والكائنات فتظل تحت سيطرة الفئة الوصفية type.

يمكن الآن إعادة كتابة الفئة Carلاستخدام هذه الفئة الوصفية. في بايثون 3، يتم ذلك عن طريق توفير "وسيط كلمة مفتاحية" metaclassلتعريف الفئة:

class Car ( object , metaclass = AttributeInitType ): @property def description ( self ) -> str : """  إرجاع وصف لهذه السيارة.  """ return " " . join ( str ( value ) for value in self .__ dict__ . values ())

يمكن إنشاء الكائن الناتج Carكالمعتاد، ولكنه قد يحتوي على أي عدد من الوسائط الرئيسية:

سيارة_جديدة : سيارة = سيارة ( صنع = 'تويوتا' ، طراز = 'بريوس' ، سنة = 2005 ، لون = 'أخضر' ، محرك = 'هجين' )

في لغة سمول توك-80

التسلسل الهرمي للفئات الوصفية في لغة Smalltalk-80 كنموذج UML
مخطط يوضح علاقات التوريث والمثيلات بين الفئات والفئات الوصفية في لغة سمول توك

في لغة سمول توك ، كل شيء عبارة عن كائن . بالإضافة إلى ذلك، تعتمد سمول توك على نظام قائم على الأصناف ، مما يعني أن لكل كائن صنفًا يُحدد بنيته (أي متغيرات النسخة الخاصة به) والرسائل التي يفهمها. وهذا يعني أن الصنف في سمول توك هو كائن، وبالتالي يجب أن يكون نسخة من صنف آخر (يُسمى الصنف الفوقي).

على سبيل المثال، كائن السيارة cهو نسخة من الفئة Car. بدورها، تُعدّ الفئة Carكائنًا، وبالتالي نسخة من الفئة الفوقية للفئة Carالمسماة Car class. لاحظ الفراغ في اسم الفئة الفوقية. اسم الفئة الفوقية هو تعبير Smalltalk الذي، عند تقييمه، ينتج عنه كائن الفئة الفوقية . بالتالي، Car classينتج عن التقييم كائن الفئة الفوقية Carالذي اسمه Car class(يمكن التأكد من ذلك بتقييم Car class nameالذي يُرجع اسم الفئة الفوقية للفئة Car).

تُعتبر توابع الصنف تابعةً للصنف الفوقي، تمامًا كما تُعتبر توابع الكائن تابعةً للصنف. عند إرسال رسالة إلى الكائن 2، يبدأ البحث عن التابع في الصنف الفوقي Integer. إذا لم يُعثر عليه، ينتقل البحث إلى الصنف الأعلى، ويتوقف عند الكائن سواءً عُثر عليه أم لا.

عند إرسال رسالة، Integerيبدأ البحث عن الطريقة في الفئة Integer classالأصلية ويستمر صعودًا في سلسلة الفئة الأصلية حتى الفئة الأصلية Object class. لاحظ أنه حتى الآن، تتبع سلسلة وراثة الفئة الأصلية سلسلة وراثة الفئة الأصلية تمامًا. لكن سلسلة الفئة الأصلية تمتد إلى أبعد من ذلك لأن Object classالفئة الأصلية هي فئة فرعية من الفئة الأصلية Class. جميع الفئات الأصلية هي فئات فرعية من الفئة الأصلية.

في الإصدارات الأولى من لغة سمول توك، كان هناك فئة وصفية واحدة فقط تُسمى `<class>` Class. هذا يعني أن جميع الدوال في جميع الفئات كانت متطابقة، وخاصة دالة إنشاء كائنات جديدة new. وللسماح للفئات بامتلاك دوالها الخاصة ومتغيراتها الخاصة (تُسمى متغيرات مثيل الفئة، ويجب عدم الخلط بينها وبين متغيرات الفئةC )، قدمت سمول توك 80 فئة وصفية خاصة لكل فئة C class. هذا يعني أن كل فئة وصفية هي في الواقع فئة أحادية النسخة .

بما أنه لا يوجد شرط بأن تتصرف الفئات الوصفية بشكل مختلف عن بعضها البعض، فإن جميع الفئات الوصفية هي نسخ من فئة واحدة فقط تسمى Metaclass. الفئة الوصفية لـ Metaclassتسمى ، Metaclass classوهي بدورها نسخة من الفئة Metaclass.

في لغة Smalltalk-80، لكل فئة (باستثناء الفئة Object) فئة أساسية . الفئة الأساسية المجردة لجميع الفئات الوصفية هي Class، والتي تصف الطبيعة العامة للفئات.

يُشابه التسلسل الهرمي للفئات العليا للفئات الوصفية التسلسل الهرمي للفئات العادية، باستثناء الفئة Object. جميع الفئات الوصفية هي فئات فرعية من Class، وبالتالي:

  • Object class superclass == Class.

كما هو الحال مع التوائم الملتصقة ، تنشأ الفئات والفئات الوصفية معًا. Metaclassتحتوي الفئة الوصفية على متغير مثيل thisClassيشير إلى فئتها الملتصقة. تجدر الإشارة إلى أن متصفح فئات Smalltalk المعتاد لا يعرض الفئات الوصفية كفئات منفصلة، ​​بل يسمح بتعديل الفئة الوصفية مع فئتها الوصفية في آنٍ واحد.

قد يختلط الأمر بسهولة بين أسماء الفئات في التسلسل الهرمي للفئات الفوقية والمفاهيم التي تحمل الاسم نفسه. على سبيل المثال:

  • Objectهي الفئة الأساسية التي توفر طرقًا مشتركة لجميع الكائنات؛ "الكائن" هو عدد صحيح، أو أداة، أو Car، إلخ.
  • Classهي أساس الفئات الوصفية التي توفر طرقًا مشتركة لجميع الفئات (على الرغم من أنها ليست فئة وصفية بحد ذاتها)؛ "الفئة" هي شيء مثل Integer، أو Widget، أو Car، إلخ.
  • Metaclassيوفر طرقًا مشتركة لجميع الفئات الوصفية.

توفر أربع فئات إمكانية وصف فئات جديدة. فيما يلي تسلسلها الهرمي للوراثة (من فئة Object)، والميزات الرئيسية التي توفرها:

الكائن - سلوك افتراضي مشترك بين جميع الكائنات، مثل الوصول إلى الفئة
السلوك - الحد الأدنى من الحالة اللازمة لتجميع الأساليب وإنشاء/تشغيل الكائنات
وصف الفئة ( فئة مجردة ) - تسمية الفئة/المتغيرات، التعليقات
فئة - مرافق مماثلة، ولكنها أكثر شمولاً، للفئات العليا
الفئة الوصفية - تهيئة متغيرات الفئة، رسائل إنشاء المثيل

في لغة روبي

يُنقّي روبي مفهوم الفئات الوصفية في لغة سمول توك-80 من خلال تقديم الفئات الذاتية ، وإزالة Metaclassالفئة، وإعادة تعريف خريطة الفئة. ويمكن تلخيص هذا التغيير كما يلي: [ 6 ]

سمول توك-80
الصفوف الدراسية
الفئات الوصفية الضمنية
  
كائنات طرفية
روبي
الصفوف الدراسية
الفئات الذاتية للفئات
الفئات الذاتية للفئات الذاتية
كائنات طرفية
الفئات الذاتية للكائنات الطرفية

لاحظ على وجه الخصوص التطابق بين الفئات الفوقية الضمنية في لغة سمول توك والفئات الذاتية للفئات في لغة روبي. يجعل نموذج الفئات الذاتية في روبي مفهوم الفئات الفوقية الضمنية موحدًا تمامًا: لكل كائن x كائن فوقي خاص به، يُسمى الفئة الذاتية لـ x ، وهو أعلى بمستوى فوقي واحد من x . عادةً ما توجد الفئات الذاتية "ذات الرتبة الأعلى" بشكل مفاهيمي بحت - فهي لا تحتوي على أي توابع أو تخزن أي بيانات (أخرى) في معظم برامج روبي. [ 7 ]

تُظهر المخططات التالية نموذجًا للبنية الأساسية للغة Smalltalk-80 ولغة Ruby للمقارنة. [ 8 ] في كلتا اللغتين، تتكون البنية من جزء مُدمج يحتوي على الكائنات الدائرية (أي الكائنات التي تظهر في حلقة مُشكّلة من خلال مجموعة من الروابط الزرقاء أو الخضراء) وجزء خاص بالمستخدم يحتوي على أربعة كائنات صريحة: الفئات Aو B و الكائنات الطرفية uو v. تُظهر الروابط الخضراء علاقة الوراثة من الابن إلى الأب (مع الاتجاه التصاعدي الضمني)، بينما تُظهر الروابط الزرقاء علاقة التكوين التكميلية من العضو إلى الحاوية (يشير الرابط الأزرق من x إلى أصغر حاوية فعلية لـ وهي نقطة البداية للبحث عن الطريقة عند استدعاء طريقة على x ). تُعرض العقد الرمادية الفئات الذاتية (أو الفئات الفوقية الضمنية في حالة Smalltalk-80).

سمول توك-80 روبي
الفئات الوصفية الضمنية في لغة Smalltalk-80 - نموذج هيكليالفئات الذاتية في روبي - بنية عينة

يوضح الرسم البياني على اليمين أيضًا آلية التقييم الكسول للفئات الذاتية في لغة روبي. vيمكن تقييم (تخصيص) الفئة الذاتية للكائن نتيجةً لإضافة توابع أحادية إليه v.

وفقًا لطريقة الاستبطان في لغة روبي المسماة class، فإن فئة كل فئة (وكل فئة ذاتية) هي دائمًا Classالفئة (المشار إليها بـ cفي الرسم التوضيحي). Classو Structهما الفئتان الوحيدتان اللتان تحتويان على فئات كأمثلة. [ 9 ] يُمنع إنشاء فئات فرعية من . باتباع التعريف القياسي للفئات الفوقية، يمكننا استنتاج أن و هما الفئتان الفوقيتان الوحيدتان في روبي. يبدو هذا متناقضًا مع التوافق بين روبي وسمول توك، حيث أن لكل فئة في سمول توك-80 فئة فوقية خاصة بها. يستند هذا التناقض إلى اختلاف طريقة الاستبطان في روبي وسمول توك. فبينما تتطابق الخريطة x ↦ x على الكائنات الطرفية، إلا أنها تختلف في تقييدها بالفئات. كما ذُكر سابقًا، بالنسبة للفئة ، فإن تعبير روبي يُقيّم دائمًا إلى . في سمول توك-80، إذا كانت فئة ، فإن التعبير يُطابق تعبير روبي - الذي يُقيّم إلى الفئة الذاتية لـ .ClassClassStructclassclassxx.classClassxx classx.singleton_classx

في لغة Objective-C

مخطط يوضح علاقات الوراثة والنسخ بين الفئات والفئات الوصفية في لغة Objective-C. لاحظ أن Objective-C تحتوي على فئات جذرية متعددة؛ لكل فئة جذرية تسلسل هرمي منفصل. يوضح هذا المخطط التسلسل الهرمي لفئة جذرية مثال NSObject فقط. لكل فئة جذرية أخرى تسلسل هرمي مماثل.

تتشابه الفئات الوصفية في لغة Objective-C إلى حد كبير مع نظيراتها في لغة Smalltalk-80، وهذا ليس بالأمر المفاجئ نظرًا لاعتماد Objective-C بشكل كبير على Smalltalk. وكما هو الحال في Smalltalk، تُعرَّف متغيرات وأساليب الكائن في Objective-C بواسطة فئة الكائن. والفئة هي كائن، وبالتالي فهي نسخة من فئة وصفية.

كما هو الحال في لغة Smalltalk، في لغة Objective-C، تُعرَّف توابع الصنف ببساطة على أنها توابع تُستدعى على كائن الصنف، ولذلك يجب تعريف توابع الصنف كتوابع مثيل في صنفه الفوقي. ولأن الأصناف المختلفة قد تحتوي على مجموعات مختلفة من توابع الصنف، يجب أن يكون لكل صنف صنفه الفوقي الخاص به. تُنشأ الأصناف والأصناف الفوقية دائمًا كزوج: حيث يمتلك وقت التشغيل دوالًا objc_allocateClassPair()لإنشاء objc_registerClassPair()وتسجيل أزواج الصنف والصنف الفوقي، على التوالي.

لا توجد أسماء للفئات الوصفية؛ ومع ذلك، يمكن الإشارة إلى مؤشر إلى أي كائن فئة باستخدام النوع العام Class(على غرار النوع idالمستخدم لمؤشر إلى أي كائن).

لأن أساليب الفئة يتم توريثها من خلال الوراثة، مثل Smalltalk، يجب أن تتبع الفئات الوصفية مخطط وراثة موازٍ لمخطط الفئات (على سبيل المثال، إذا كانت الفئة الأصلية للفئة A هي الفئة B، فإن الفئة الأصلية للفئة الوصفية A هي الفئة الوصفية B)، باستثناء الفئة الجذرية.

على عكس لغة Smalltalk، ترث الفئة الوصفية للفئة الجذرية من الفئة الجذرية نفسها (عادةً NSObjectباستخدام إطار عمل Cocoa ). وهذا يضمن أن جميع كائنات الفئة هي في النهاية نسخ من الفئة الجذرية، بحيث يمكنك استخدام توابع النسخ الخاصة بالفئة الجذرية، والتي عادةً ما تكون توابع مساعدة مفيدة للكائنات، على كائنات الفئة نفسها.

بما أن كائنات الفئة الوصفية لا تتصرف بشكل مختلف (لا يمكنك إضافة توابع فئة إلى فئة وصفية، لذا فإن جميع كائنات الفئة الوصفية لها نفس التوابع)، فإنها جميعًا تُعدّ نسخًا من نفس الفئة - الفئة الوصفية للفئة الجذرية (على عكس لغة سمول توك). وبالتالي، فإن الفئة الوصفية للفئة الجذرية هي نسخة من نفسها. والسبب في ذلك هو أن جميع الفئات الوصفية ترث من الفئة الجذرية؛ لذا، يجب أن ترث توابع الفئة الجذرية. [ 10 ]

اقتراح بلغة C++

اقترح هيرب ساتر ، من لجنة ISO C++، لأول مرة إضافة الفئات الوصفية إلى لغة C++ في الإصدار C++20 باستخدام ميزات C++17 . [ 11 ] ومع اعتماد تقنية الانعكاس في الإصدار C++26 ، تم تنقيح هذه الورقة. [ 12 ]

يهدف هذا النظام بشكل أساسي إلى توسيع نطاق تجريد لغة C++ ليشمل مفردات قابلة للتبني (مثل `<input>` و`<input>` و`<input>` و`<input>` وغيرها) class، وذلك structبهدف unionاتباع نهج أكثر مرونة في البرمجة بعيدًا عن حفظ القواعد. كما تتيح هذه الميزة إمكانية التعبير عن الميزات غير القياسية (مثل واجهات المستخدم ) كميزات أساسية ضمن المكتبات، مما يُغني عن الحاجة إلى مُترجمات متخصصة (مثل Qt moc و C++/CX وغيرها) للتعبير عن معلومات محددة باستخدام ميزات قياسية.enuminterfacevalue

باستخدام حقن التعليمات البرمجية (إضافة مقترحة أخرى لانعكاس C++ والتي ستضيف حقن تسلسل الرموز المميزة في التعليمات البرمجية المصدرية) [ 13 ] ، يمكن للمرء إنشاء نمط Java/C# " interface" باستخدام constevalدالة:

استيراد std ؛باستخدام std :: string ؛ باستخدام std :: string_view ؛ باستخدام std :: meta :: exception ؛ باستخدام std :: meta :: info ؛[[ nodiscard ]] consteval info makeInterfaceFunctions ( info proto ) noexcept { info ret = ^^ {}; for ( info mem : std :: meta :: members_of ( proto )) { if ( std :: meta :: is_nonspecial_member_function ( mem )) { ret = ^^ { \ tokens ( ret ) virtual [ : \ ( std :: meta :: return_type_of ( mem )) : ] \ id ( std :: meta :: identifier_of ( mem )) ( \ tokens ( std :: meta :: parameter_list_of ( mem ))) = 0 ; }; } else if ( std :: meta :: is_variable ( mem )) { // ملاحظة: هذا استثناء من نوع std::meta::exception، وليس استثناء من نوع std::exception throw exception ( "تمت مصادفة متغير في النموذج الأولي" , ^^ makeInterfaceFunctions ); } } return ret ; }consteval void interface ( info proto ) noexcept { string_view name = std :: meta :: identifier_of ( proto ); std :: meta :: queue_injection ( ^^ { class \ id ( name ) { public : // إنشاء دوال الواجهة \ tokens ( makeInterfaceFunctions ( proto )) // المُدمِّر virtual ~ \ id ( name )() = default ; // المُنشئ \ id ( name )() = default ; // حذف مُنشئ النسخ \ id ( name )( const \ id ( name ) & ) = delete ; // حذف عامل إسناد النسخ void operator = ( const \ id ( name ) & ) = delete ; }; }); }// استخدم "interface": class ( interface ) IFoo { int f (); void g ( string s ); };

سيكون من الممكن أيضًا تطبيق أنواع متعددة من الفئات الوصفية. على سبيل المثال، بالنسبة للفئات الوصفية xو y، يمكن كتابة .class(x,y)MyClass{/* ... */};

تقترح هذه الورقة البحثية أن هذا يسمح بتقليل الشيفرة النمطية بشكل كبير من خلال إنتاج دوال مُولَّدة وقيم افتراضية ودلالات وقيود قابلة للتخصيص. كما أنه يُلغي الحاجة إلى إنشاء مقترحات جديدة لميزات اللغة من خلال السماح بالتعبير عن هذه الميزات باستخدام ميزات الفئات الوصفية.

الدعم في اللغات والأدوات

فيما يلي بعض من أبرز لغات البرمجة التي تدعم الفئات الوصفية.

تتضمن بعض اللغات الأقل انتشارًا التي تدعم الفئات الوصفية OpenJava [ 14 ] و OpenC++ [ 15 ] [ 16 ] و OpenAda و CorbaScript و ObjVLisp و Object-Z و MODEL-K و XOTcl و MELDC . يعود تاريخ العديد من هذه اللغات إلى أوائل التسعينيات، وهي ذات أهمية أكاديمية. [ 17 ]

ميزات جافاjava.lang.Class<T> للاستبطان ، على غرار الفئات الوصفية ، ولكنها ليست فئات وصفية في الواقع.

يدعم Logtalk ، وهو امتداد موجه للكائنات للغة Prolog ، الفئات الوصفية أيضًا.

يدعم كل من إطار وصف الموارد (RDF) ولغة النمذجة الموحدة (UML) الفئات الوصفية.

تم اقتراح الفئات الوصفية لإدراجها المحتمل في الإصدارات المستقبلية من لغة C++ ، ولكنها ليست ميزة مدرجة حاليًا. [ 11 ]

انظر أيضاً

مراجع

  1. فورمان، إيرا ر.؛ دانفورث، سكوت (1999). توظيف الفئات الوصفية . أديسون-ويسلي. ISBN 0-201-43305-2.
  2. ألور رافي، سليخة (2022). البرمجة الوصفية باستخدام بايثون . برمنغهام: دار نشر باكت.
  3. برمجة فئات IBM الوصفية في بايثون، الأجزاء 1 ( مؤرشف في 3 سبتمبر 2008 على Wayback Machine) ، 2 ( مؤرشف في 23 أغسطس 2008 على Wayback Machine) ، و 3 ( مؤرشف في 21 مارس 2009 على Wayback Machine)
  4. منتدى أرتيما: الفئات الوصفية في بايثون 3.0 (الجزء 1 من 2) مؤرشف في 24 سبتمبر 2020 على موقع Wayback Machine (الجزء 2 من 2) مؤرشف في 9 أبريل 2016 على موقع Wayback Machine
  5. ميرتز، ديفيد. "مقدمة في برمجة الفئات الوصفية في بايثون" . ONLamp . مؤرشف من الأصل في 30 أبريل 2003. تم الاطلاع عليه في 28 يونيو 2006 .
  6. "نموذج كائنات روبي: مقارنة مع سمول توك-80" . مؤرشف من الأصل في 17 يناير 2020. تم الاطلاع عليه في 10 فبراير 2012 .
  7. بيروتا، باولو (2010). برمجة ما وراء البرمجة في روبي . مكتبة براغماتيك. رقم ISBN 978-1-934356-47-0أُرشف من المصدر الأصلي في 9 يونيو 2016. تم الاطلاع عليه في 21 نوفمبر 2013 .
  8. "عضوية الكائن: البنية الأساسية لتقنية الكائنات" . مؤرشف من الأصل في 6 مايو 2021. تم الاطلاع عليه في 24 أغسطس 2012 .
  9. "البنية" . مؤرشف من الأصل في 3 مايو 2025. تم الاطلاع عليه في 28 أبريل 2025 .
  10. "ما هي الفئة الوصفية في لغة أوبجكتيف-سي؟" . كوكو مع الحب . ١٧ يناير ٢٠١٠. مؤرشف من الأصل في ٦ أغسطس ٢٠١١. تم الاطلاع عليه في ٢٢ يوليو ٢٠١١ .
  11. 1 2 ساتر، هيرب (18 يونيو 2017). "P0707 R0 - الفئات الوصفية" (ملف PDF) . open-std.org . WG21. مؤرشف (ملف PDF) من الأصل في 11 نوفمبر 2020. تم الاطلاع عليه في 8 أغسطس 2018 .
  12. ساتر، هيرب (12 أكتوبر 2024). "تأليف الفئات التصريحية باستخدام دوال التكرار + الانعكاس + التوليد (المعروف أيضًا باسم: الفئات الوصفية للغة C++ التوليدية)" (ملف PDF) . open-std.org . WG21 . تم الاطلاع عليه في 14 ديسمبر 2025 .
  13. أندريه ألكسندرسكو، باري ريزفين، دافيد فانديفورد (16 يوليو 2024). "حقن التعليمات البرمجية باستخدام تسلسلات الرموز" . open-std.org . WG21.{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط )
  14. ^ ميشياكي تاتسوبوري (14 أكتوبر 2007). "OJ: جافا قابلة للتوسيع" . csg.ci.iu-tokyo.ac.jp . جامعة طوكيو. مؤرشفة من الأصلي في 13 أغسطس 2014.
  15. شيغيرو تشيبا (14 أكتوبر 2007). "الصفحة الرئيسية لـ OpenC++" . csg.ci.iu-tokyo.ac.jp . جامعة طوكيو. مؤرشف من الأصل في 21 أغسطس 2014.
  16. شيغيرو تشيبا. "مرحباً بكم في OpenC++" . opencxx.sourceforge.net . جامعة طوكيو . تاريخ الاسترجاع: 10 ديسمبر 2025 .
  17. "تطبيق للمزيجات في جافا باستخدام الفئات الوصفية" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 16 أكتوبر 2007. تم الاطلاع عليه بتاريخ 27 نوفمبر 2007 .