الفصل (البرمجة)

في البرمجة ، تُعرَّف الفئة بأنها بنية كيان نحوية تُستخدم لإنشاء الكائنات . [ 1 ] : 1.3.3 تختلف إمكانيات الفئة بين لغات البرمجة ، ولكن بشكل عام، تتكون الجوانب المشتركة من الحالة ( المتغيرات ) والسلوك ( الأساليب )، ويرتبط كل منهما إما بكائن معين أو بجميع كائنات تلك الفئة. [ 2 ] [ 3 ]

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

إذا كانت اللغة تدعم الوراثة ، فيمكن تعريف فئة بناءً على فئة أخرى بكل خصائصها وسلوكها، بالإضافة إلى خصائص وسلوك إضافية تُخصّص الفئة. تُسمى الفئة المُخصّصة فئة فرعية ، والفئة التي بُنيت عليها تُسمى فئتها الأصلية .

في لغات البرمجة الموجهة للكائنات بشكل بحت، مثل Java و C# ، قد تكون جميع الفئات جزءًا من شجرة وراثة بحيث تكون الفئة الجذرية هي Object، مما يعني أن جميع مثيلات الكائنات هي من Objectأو تمتد ضمنيًا Object، وهو ما يسمى النوع الأعلى .

تاريخ

طُرح هذا المفهوم بشكل أساسي في البرمجة كائنية التوجه من خلال لغة سيمولا في ستينيات القرن الماضي، ولا يزال يُستخدم باستمرار في العديد من لغات البرمجة منذ ذلك الحين. [ 1 ] : 1.3.3 وقد استند ابتكاره إلى مفهوم مشابه لمفهوم الكتلة المستخدمة في لغة البرمجة ALGOL 68 القائمة على التبعية المسبقة . [ 1 ] : 1.3.2

صفات

دورة حياة الكائن

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

تسمح معظم لغات البرمجة بتطبيق منطق مخصص في أحداث دورة الحياة عبر مُنشئ ومُدمر .

يكتب

يُعبّر الكائن عن نوع البيانات كواجهة - نوع كل متغير عضو وتوقيع كل دالة عضو (طريقة). يُعرّف الصنف تطبيقًا للواجهة، ويؤدي إنشاء مثيل للصنف إلى كائن يُظهر التطبيق عبر الواجهة. [ 4 ] من منظور نظرية الأنواع، يُعد الصنف تطبيقًا - بنيةبيانات ملموسة ومجموعة من الإجراءات الفرعية -بينما يُعد النوع واجهة . يمكن لأصناف (ملموسة) مختلفة أن تُنتج كائنات من نفس النوع ( المجرد ) (بحسب نظام الأنواع). على سبيل المثال، قد يُطبّق النوع (الواجهة) Stack بواسطة SmallStack ، وهو سريع للمكدسات الصغيرة ولكنه ضعيف التوسع، و ScalableStack، وهو قابل للتوسع بشكل جيد ولكنه ذو تكلفة عالية للمكدسات الصغيرة.

بناء

تدوين UML للفئات

تحتوي الفئة على حقول بيانات موصوفة نحويًا (أو خصائص ، أو حقول ، أو أعضاء بيانات ، أو سمات ). [ 1 ] عادةً ما تكون هذه أنواع حقول وأسماء تُربط بمتغيرات الحالة أثناء تشغيل البرنامج؛ تنتمي متغيرات الحالة هذه إما إلى الفئة أو إلى نسخ محددة منها. في معظم لغات البرمجة، يُحدد الهيكل المُعرّف بواسطة الفئة تخطيط الذاكرة المستخدمة من قِبل نسخها. توجد تطبيقات أخرى ممكنة: على سبيل المثال، تستخدم الكائنات في بايثون حاويات مفتاح-قيمة ترابطية. [ 5 ]

تدعم بعض لغات البرمجة، مثل إيفل، تحديد الثوابت كجزء من تعريف الصنف، وتفرضها من خلال نظام الأنواع. ويُعد تغليف الحالة ضروريًا لفرض ثوابت الصنف.

سلوك

يُحدد سلوك (أو فعل [ 1 ] ) الصنف أو مثيلاته باستخدام الدوال . الدوال هي إجراءات فرعية قادرة على العمل على الكائنات أو الأصناف. قد تُغير هذه العمليات حالة الكائن أو تُوفر ببساطة طرقًا للوصول إليه. [ 6 ] توجد أنواع عديدة من الدوال، لكن دعمها يختلف بين اللغات. بعض أنواع الدوال يُنشئها ويستدعيها كود المبرمج، بينما تُنشأ وتُستدعى دوال خاصة أخرى - مثل الدوال البانية والمدمرة ومعاملات التحويل - بواسطة الكود المُولّد من المُترجم. قد تسمح اللغة أيضًا للمبرمج بتعريف هذه الدوال الخاصة واستدعائها. [ 7 ] [ 8 ]

واجهة المستخدم

تُنفّذ كل فئة واجهةً من خلال توفير بنية وسلوك . تتكون البنية من البيانات والحالة، بينما يتكون السلوك من التعليمات البرمجية التي تُحدد كيفية تنفيذ الدوال. [ 9 ] ثمة فرق بين تعريف الواجهة وتنفيذها؛ إلا أن هذا الخط الفاصل غير واضح في العديد من لغات البرمجة لأن تعريفات الفئات تُعرّف الواجهة وتُنفّذها في آنٍ واحد. مع ذلك، تُوفر بعض اللغات ميزات تفصل بين الواجهة والتنفيذ. على سبيل المثال، يُمكن لفئة مجردة تعريف واجهة دون توفير تنفيذها.

اللغات التي تدعم وراثة الفئات تسمح أيضًا للفئات بتوريث الواجهات من الفئات التي اشتُقت منها.

على سبيل المثال، إذا كان " " يرث من " " وإذا كان " " ينفذ الواجهة " " فإن " " ينفذ أيضًا الوظائف (الثوابت وإعلان الأساليب) التي يوفرها " ".classZclassYclassYinterfaceXclassZinterfaceX

في اللغات التي تدعم محددات الوصول ، تعتبر واجهة الفئة هي مجموعة الأعضاء العامة للفئة، بما في ذلك كل من الأساليب والسمات (عبر أساليب getter و setter الضمنية )؛ أي أعضاء خاصة أو هياكل بيانات داخلية لا يُقصد الاعتماد عليها بواسطة التعليمات البرمجية الخارجية، وبالتالي فهي ليست جزءًا من الواجهة.

Object-oriented programming methodology dictates that the operations of any interface of a class are to be independent of each other. It results in a layered design where clients of an interface use the methods declared in the interface. An interface places no requirements for clients to invoke the operations of one interface in any particular order. This approach has the benefit that client code can assume that the operations of an interface are available for use whenever the client has access to the object.[10]

Interface example

The buttons on the front of your television set are the interface between you and the electrical wiring on the other side of its plastic casing. You press the "power" button to toggle the television on and off. In this example, your particular television is the instance, each method is represented by a button, and all the buttons together compose the interface (other television sets that are the same model as yours would have the same interface). In its most common form, an interface is a specification of a group of related methods without any associated implementation of the methods.

A television set also has a myriad of attributes, such as size and whether it supports color, which together comprise its structure. A class represents the full description of a television, including its attributes (structure) and buttons (interface).

Getting the total number of televisions manufactured could be a static method of the television class. This method is associated with the class, yet is outside the domain of each instance of the class. A static method that finds a particular instance out of the set of all television objects is another example.

Member accessibility

The following is a common set of access specifiers:[11]

  • Private (or class-private) restricts access to the class itself. Only methods that are part of the same class can access private members.
  • Protected (or class-protected) allows the class itself and all its subclasses to access the member.
  • Public means that any code can access the member by its name.

Although many object-oriented languages support the above access specifiers, their semantics may differ.

Object-oriented design uses the access specifiers in conjunction with careful design of public method implementations to enforce class invariants—constraints on the state of the objects. A common usage of access specifiers is to separate the internal data of a class from its interface: the internal structure is made private, while public accessor methods can be used to inspect or alter such private data.

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

تفرض لغات البرمجة الكائنية المختلفة إمكانية الوصول إلى أعضاء الفئات ورؤيتها بدرجات متفاوتة، وذلك تبعًا لنظام أنواع اللغة وسياسات الترجمة، حيث يتم فرض ذلك إما في وقت الترجمة أو وقت التشغيل . على سبيل المثال، لا تسمح لغة جافا بتجميع شيفرة العميل التي تصل إلى البيانات الخاصة بفئة ما. [ 13 ] في لغة سي++ ، تكون الطرق الخاصة مرئية، ولكن لا يمكن الوصول إليها في الواجهة؛ ومع ذلك، يمكن إخفاؤها من خلال تعريف فئات مجردة بالكامل تمثل واجهات الفئة. [ 14 ]

تتضمن بعض اللغات أنظمة أخرى لتسهيل الوصول:

  • إمكانية الوصول إلى الكائن مقابل إمكانية الوصول إلى الفئة : يدعم روبي مُحدِّدات الوصول الخاصة بالكائن والمحمية بالكائن بدلاً من مُحدِّدات الوصول الخاصة بالفئة والمحمية بالفئة، على التوالي. ويكمن الاختلاف بينهما في أنهما يقيدان الوصول بناءً على الكائن نفسه، وليس على فئة الكائن. [ 15 ]
  • الصديق : تدعم لغة C++ آلية تسمح للدالة المُعلنة صراحةً كدالة صديقة للفئة بالوصول إلى الأعضاء المُصنفة على أنها خاصة أو محمية. [ 16 ]
  • يعتمد الوصول إلى الملفات على المسار : تدعم لغة جافا تقييد الوصول إلى عنصر داخل حزمة جافا ، وهو المسار المنطقي للملف. مع ذلك، من الممارسات الشائعة عند توسيع إطار عمل جافا تنفيذ الفئات في نفس حزمة فئة إطار العمل للوصول إلى العناصر المحمية. قد يوجد ملف المصدر في موقع مختلف تمامًا، وقد يتم نشره في ملف .jar مختلف ، ولكنه يظل ضمن نفس المسار المنطقي بالنسبة لآلة جافا الافتراضية (JVM). [ 11 ]

الميراث

مفهوميًا، تُعرَّف الفئة العليا بأنها مجموعة شاملة لفئاتها الفرعية. على سبيل المثال، GraphicObjectقد تكون الفئة العليا (x) فئةً عليا للفئتين x Rectangleو y Ellipse، بينما Squareتكون الفئة الفرعية (x) فئةً فرعيةً من x Rectangle. وهذه كلها علاقات مجموعات جزئية في نظرية المجموعات أيضًا، أي أن جميع المربعات مستطيلات، ولكن ليس كل المستطيلات مربعات.

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

في نمذجة الكائنات، تُنمذج هذه الأنواع من العلاقات عادةً كخصائص للكائنات. في هذا المثال، Carسيحتوي الصنف على خاصية تُسمى parts. partsسيتم تحديد نوع ليحتوي على مجموعة من الكائنات، مثل مثيلات Body، Engine، Tires، إلخ. تتضمن لغات نمذجة الكائنات، مثل UML، إمكانيات لنمذجة جوانب مختلفة من "جزء من" وأنواع أخرى من العلاقات - بيانات مثل عدد الكائنات، والقيود المفروضة على قيم الإدخال والإخراج، وما إلى ذلك. يمكن لأدوات المطورين استخدام هذه المعلومات لإنشاء تعليمات برمجية إضافية إلى جانب تعريفات البيانات الأساسية للكائنات، مثل التحقق من الأخطاء في دوال get و set . [ 17 ]

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

تتطلب معظم لغات البرمجة الكائنية الحديثة، مثل سمول توك وجافا، وراثة أحادية أثناء التشغيل. بالنسبة لهذه اللغات، قد تكون الوراثة المتعددة مفيدة للنمذجة، ولكنها غير ضرورية للتنفيذ.

مع ذلك، تحتوي كائنات تطبيقات الويب الدلالي على فئات أساسية متعددة. تتطلب طبيعة الإنترنت المتقلبة هذا المستوى من المرونة، وقد صُممت معايير التكنولوجيا، مثل لغة الويب الأنطولوجية (OWL)، لدعم ذلك.

تُعدّ إمكانية تعديل التسلسل الهرمي للفئات أثناء التشغيل مسألةً مشابهة. تدعم لغات مثل Flavors وCLOS وSmalltalk هذه الميزة كجزء من بروتوكولات الكائنات الوصفية الخاصة بها . وبما أن الفئات تُعتبر كائنات من الدرجة الأولى، فمن الممكن تعديل بنيتها ديناميكيًا عن طريق إرسال الرسائل المناسبة إليها. أما اللغات الأخرى التي تُركّز على الكتابة القوية، مثل Java وC++، فلا تسمح بتعديل التسلسل الهرمي للفئات أثناء التشغيل. تتمتع كائنات الويب الدلالي بإمكانية إجراء تغييرات على الفئات أثناء التشغيل. ويُشابه هذا المنطق مبرر السماح بوجود فئات أساسية متعددة، وهو أن الإنترنت يتميز بديناميكية ومرونة عاليتين، ما يستدعي إجراء تغييرات ديناميكية على التسلسل الهرمي لإدارة هذا التقلب. [ 19 ]

على الرغم من أن العديد من لغات البرمجة القائمة على الأصناف تدعم الوراثة، إلا أن الوراثة ليست سمة جوهرية للأصناف. فمثلاً ، تدعم لغة البرمجة الكائنية (مثل فيجوال بيسك الكلاسيكية ) الأصناف، لكنها لا تدعم الوراثة.

العلاقات بين الطبقات

قد تدعم لغة البرمجة ميزات مختلفة للعلاقات بين الفئات.

التأليف الموسيقي

يمكن أن تتكون الفئات من فئات أخرى، مما يُنشئ علاقة تركيبية بين الفئة المُحيطة والفئات المُضمنة فيها. تُعرف العلاقة التركيبية بين الفئات أيضًا باسم علاقة " يحتوي على" . [ 20 ]Car على سبيل المثال، يمكن أن تتكون فئة من فئة أخرى وتحتوي على فئة ثالثة Engine. لذلك، فإن الفئة الأولى Carتحتوي على الفئة الثانيةEngine . أحد جوانب التركيب هو الاحتواء، وهو احتواء مثيلات المكونات بواسطة المثيل الذي يحتويها. إذا كان الكائن المُحيط يحتوي على مثيلات المكونات بالقيمة، فإن المكونات والكائن المُحيط بها يكون لهما عمر مماثل . أما إذا كانت المكونات مُحتواة بالمرجع، فقد لا يكون لها عمر مماثل. [ 21 ] على سبيل المثال، في Objective-C 2.0:

@interface Car : NSObject@property NSString * name ; @property Engine * engine @property NSArray * tires ;@نهاية

تحتوي فئة السيارة هذه على مثيل من NSString ( كائن سلسلة نصية )، و Engine ، و NSArray (كائن مصفوفة).

هرمي

يمكن اشتقاق الفئات من فئة واحدة أو أكثر من الفئات الموجودة، مما يؤدي إلى إنشاء علاقة هرمية بين الفئات المشتقة ( الفئات الأساسية ، والفئات الأصلية ، أوالفئات الأصلية (الفئات العليا ) والفئات المشتقة (الفئات الفرعية).تُعرف العلاقة بين الفئة المشتقة والفئات المشتقة منها بعلاقة "هو نوع من" . [ 22 ] على سبيل المثال، يمكن اشتقاق فئة "زر" من فئة "عنصر تحكم". وبالتالي، فإن الزرهوترثالفئات الفرعية العناصر الهيكلية والسلوكية للفئات الأصلية. يمكن للفئات المشتقة تعريف عناصر هيكلية إضافية (حقول بيانات) وعناصر سلوكية إضافية (أساليب) بالإضافة إلى تلك التيترثهاوبالتالي فهيتخصصاتلفئاتها الأصلية. كما يمكن للفئات المشتقةإعادة تعريفالأساليب الموروثة إذا سمحت لغة البرمجة بذلك.

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

مثال (كود Objective-C 2.0 مبسط، من حزمة تطوير البرامج الخاصة بـ iPhone):

@interface UIResponder : NSObject //... @interface UIView : UIResponder //... @interface UIScrollView : UIView //... @interface UITableView : UIScrollView //...

في هذا المثال، UITableView هو UIScrollView هو UIView هو UIResponder هو NSObject.

النمذجة

في التحليل الكائني التوجه ولغة النمذجة الموحدة (UML)، يُمثل الارتباط بين فئتين تعاونًا بينهما أو بين مثيلاتهما. تتسم الارتباطات باتجاه محدد؛ فعلى سبيل المثال، يشير الارتباط ثنائي الاتجاه بين فئتين إلى أن كلتا الفئتين على دراية بعلاقتهما. [ 24 ] ويمكن تسمية الارتباطات وفقًا لاسمها أو غرضها. [ 25 ]

يُحدد دور الارتباط في نهاية الارتباط، ويصف دور الفئة المقابلة. على سبيل المثال، يصف دور "المشترك" كيفية مشاركة مثيلات فئة "الشخص" في ارتباط "الاشتراك في" مع فئة "المجلة". كما أن لفئة "المجلة" دور "المجلة المشتركة" في نفس الارتباط. يحدد تعدد أدوار الارتباط عدد المثيلات التي تتوافق مع كل مثيل من الفئة الأخرى في الارتباط. من التعددات الشائعة: "0..1"، "1..1"، "1..*"، و"0..*"، حيث تشير علامة "*" إلى أي عدد من المثيلات. [ 24 ]

التصنيف

هناك العديد من فئات الفصول الدراسية، بعضها يتداخل.

مجرد وملموس

في لغة تدعم الوراثة، تُعرَّف الفئة المجردة ، أو الفئة الأساسية المجردة ( ABC )، بأنها فئة لا يمكن إنشاء مثيل لها مباشرةً. في المقابل، تُعرَّف الفئة الملموسة بأنها فئة يمكن إنشاء مثيل لها مباشرةً. ولا يمكن إنشاء مثيل للفئة المجردة إلا بشكل غير مباشر، عبر فئة فرعية ملموسة .

يُصنَّف الصنف المجرد إما صراحةً على هذا النحو، أو قد يُحدِّد ببساطة توابع مجردة (أو توابع افتراضية ). قد يُوفِّر الصنف المجرد تطبيقات لبعض التوابع، وقد يُحدِّد أيضًا توابع افتراضية عبر توقيعات تُنفَّذ بواسطة الأصناف الفرعية المباشرة أو غير المباشرة للصنف المجرد. قبل إنشاء مثيل لصنف مُشتق من صنف مجرد، يجب أن تُنفَّذ جميع التوابع المجردة لأصنافه الأصلية بواسطة صنف ما في سلسلة الاشتقاق. [ 26 ]

تتيح معظم لغات البرمجة كائنية التوجه للمبرمج تحديد الفئات التي تُعتبر مجردة، ولا تسمح بإنشاء مثيلات منها. على سبيل المثال، في لغات Java و C# و PHP ، تُستخدم الكلمة المحجوزة (keyword) . [ 27 ] [ 28 ] أما في لغة C++ ، فالفئة المجردة هي فئة تحتوي على دالة مجردة واحدة على الأقل، مُعرّفة بالصيغة المناسبة في تلك اللغة (دالة افتراضية بحتة في مصطلحات C++). [ 26 ]abstract

يُطلق على الصنف الذي يتكون من توابع افتراضية بحتة اسم الصنف الأساسي المجرد البحت (أو ABC البحت ) في لغة C++، ويُعرف أيضًا باسم الواجهة من قِبل مستخدمي اللغة. [ 14 ] تدعم لغات أخرى، ولا سيما Java وC#، نوعًا مختلفًا من الأصناف المجردة يُسمى الواجهة ، وذلك عبر كلمة مفتاحية في اللغة. في هذه اللغات، لا يُسمح بالوراثة المتعددة ، ولكن يمكن للصنف الواحد تنفيذ عدة واجهات. لا يمكن أن يحتوي هذا الصنف إلا على توابع مجردة متاحة للعامة. [ 23 ] [ 29 ] [ 30 ]

محلي وداخلي

في بعض اللغات، يمكن تعريف الأصناف في نطاقات أخرى غير النطاق العام. وهناك أنواع مختلفة من هذه الأصناف.

الصنف الداخلي هو صنف مُعرَّف داخل صنف آخر. ويمكن اعتبار العلاقة بين الصنف الداخلي والصنف المُحتوي له نوعًا آخر من أنواع ارتباط الأصناف. عادةً، لا يرتبط الصنف الداخلي بمثيلات الصنف المُحتوي، ولا يتم إنشاء مثيلاته معه. وبحسب لغة البرمجة، قد يكون من الممكن أو غير الممكن الإشارة إلى الصنف من خارج الصنف المُحتوي. ومن المفاهيم ذات الصلة الأنواع الداخلية ، والمعروفة أيضًا بنوع البيانات الداخلي أو النوع المُتداخل ، وهي تعميم لمفهوم الأصناف الداخلية. تُعد لغة C++ مثالًا على لغة تدعم كلاً من الأصناف الداخلية والأنواع الداخلية (عبر تعريفات typedef ). [ 31 ] [ 32 ]

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

فئة ميتا

الفئة الفوقية هي فئة تكون مثيلاتها عبارة عن فئات. [ 34 ] تصف الفئة الفوقية بنية مشتركة لمجموعة من الفئات، ويمكنها تطبيق نمط تصميم أو وصف أنواع معينة من الفئات. تُستخدم الفئات الفوقية غالبًا لوصف الأطر البرمجية . [ 35 ]

في بعض اللغات، مثل بايثون وروبي وسمول توك ، يُعتبر الصنف كائنًا أيضًا؛ وبالتالي ، يُعد كل صنف نسخةً من صنفٍ وصفيٍّ فريدٍ مُدمجٍ في اللغة. [ 5 ] [ 36 ] [ 37 ] يوفر نظام كائنات Common Lisp (CLOS) بروتوكولات الكائنات الوصفية (MOPs) لتنفيذ هذه الأصناف والأصناف الوصفية. [ 38 ]

أخير

لا يمكن إنشاء فئات فرعية من الفئة النهائية . وهي عكس الفئة المجردة، التي يجب إنشاء فئات فرعية منها لاستخدامها ولا يمكن إنشاء مثيل لها مباشرةً. أما الفئة النهائية فهي ضمنيًا فئة ملموسة، ويمكن إنشاء مثيل لها مباشرةً.

يُعلن عن الفئة على أنها نهائية باستخدام الكلمة المفتاحية `final` finalفي لغات Java وC++ وPHP، أو sealedفي لغة C#. مع ذلك، يجب عدم الخلط بين هذا المفهوم والفئات في Java التي تُعرّف باستخدام الكلمة المفتاحية `final` sealed، والتي تسمح فقط بالوراثة من فئات فرعية محددة. [ 39 ] [ 40 ] [ 41 ] [ 42 ] في لغات مثل Kotlin ، تكون جميع الفئات نهائية افتراضيًا، بينما للسماح بالوراثة من فئة ما، يجب بدلاً من ذلك وضع علامة `final` عليها open. [ 43 ]

على سبيل المثال، يتم تمييز فئة جافا على أنها . [ 44 ]Stringfinal

قد تسمح الفئات النهائية للمترجم بإجراء تحسينات غير متاحة للفئات التي يمكن اشتقاق فئات فرعية منها. [ 45 ]

مختوم

الفئة "المغلقة" هي فئة تقيّد الوراثة بقائمة مختارة من الفئات. يجب عدم الخلط بينها وبين الكلمة sealedالمفتاحية `final` في لغة C#، والتي تشير إلى فئة نهائية. يتم تحديد قائمة الفئات المسموح للفئة المغلقة أن ترثها باستخدام permitsعبارة `context`. [ 46 ]

public sealed class Quadrilateral extends Shape implements Renderable , Transformable , Comparable < Quadrilateral > , Measurable permits Parallelogram , Trapezoid , Kite { // ... }

non-sealed[ 47 ] هي كلمة مفتاحية أخرى تُستخدم للإعلان عن أن فئة أو واجهة ترث فئة مغلقة يمكن أن ترثها فئات غير معروفة.

فئة متوازي الأضلاع المغلقة تمتد من فئة رباعي الأضلاع { /* ... */ } فئة مستطيلة مغلقة تمتد من فئة متوازي الأضلاع { /* ... */ }فئة غير مغلقة تُسمى Square تمتد من Rectangle { /* ... */ }// بما أن فئة Square غير مغلقة، يمكن لأي فئة أن ترث منها class RedSquare extends Square { /* ... */ }

يفتح

يمكن تعديل الفئات المفتوحة. عادةً، لا يمكن للمستخدمين تعديل البرامج التنفيذية . يستطيع المطورون تعديل بعض الفئات، ولكن لا يمكنهم عادةً تعديل الفئات القياسية أو المدمجة. في لغة روبي ، جميع الفئات مفتوحة. في لغة بايثون ، يمكن إنشاء الفئات أثناء التشغيل، ويمكن تعديلها جميعًا لاحقًا. [ 48 ] تسمح فئات أوبجكتيف-سي للمبرمج بإضافة توابع إلى فئة موجودة دون الحاجة إلى إعادة تجميع تلك الفئة أو حتى الوصول إلى شفرتها المصدرية.

مزيج

تدعم بعض لغات البرمجة خاصية "المزيجات" بشكل خاص ، ولكن في أي لغة برمجة تدعم الوراثة المتعددة، فإن المزيج هو ببساطة فئة لا تمثل علاقة "نوع من". تُستخدم المزيجات عادةً لإضافة نفس الدوال إلى فئات متعددة؛ على سبيل المثال، UnicodeConversionMixinقد توفر فئة ما دالة تُسمى unicodeToAscii()عند تضمينها في فئات أخرى FileReaderلا WebPageScraperتشترك في فئة أصلية واحدة.

جزئي

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

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

تشمل الفوائد والآثار الأخرى لميزة الفئة الجزئية ما يلي:

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

لطالما وُجدت الفئات الجزئية في لغة سمول توك تحت مسمى امتدادات الفئات . ومع ظهور إطار عمل .NET 2 ، قدمت مايكروسوفت الفئات الجزئية، المدعومة في كل من لغة C# 2.0 وفيجوال بيسك 2005. كما يدعم نظام التشغيل WinRT الفئات الجزئية أيضًا. [ 51 ]

غير قابل للتجسيد

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

staticعلى سبيل المثال، في لغة C#، لا يمكن إنشاء مثيل لفئة تحمل علامة معينة، ولا يمكن أن تحتوي إلا على أعضاء ثابتة (حقول، وأساليب، وغيرها)، ولا يجوز أن تحتوي على مُنشئات مثيل ، وهي sealedنهائية (غير قابلة للتكرار). [ 52 ]

لم يُذكر اسم

لا يرتبط الصنف غير المسمى أو الصنف المجهول باسم أو مُعرِّف عند تعريفه. [ 53 ] [ 54 ] وهذا يُشابه الفرق بين الدوال المسماة والدوال غير المسماة .

واجهة التحية { void sayHello (); }// فئة مجهولة تُنفذ واجهة Greeting Greeting myGreeting = new Greeting () { @Override public void sayHello () { System . out . println ( "مرحباً من فئة مجهولة!" ); } };myGreeting.sayHello ( ) ;

فوائد

تندرج فوائد تنظيم البرامج في فئات الكائنات ضمن ثلاث فئات: [ 55 ]

  • التطور السريع
  • سهولة الصيانة
  • إعادة استخدام التعليمات البرمجية والتصاميم

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

تُسهّل فئات الكائنات عملية الصيانة من خلال التغليف. فعندما يحتاج المطورون إلى تغيير سلوك كائن ما، يمكنهم حصر التغيير في ذلك الكائن ومكوناته فقط. وهذا يقلل من احتمالية حدوث آثار جانبية غير مرغوب فيها نتيجةً لتحسينات الصيانة.

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

تمثيل وقت التشغيل

كنوع بيانات، يُعتبر الصنف عادةً بنيةً تُنشأ أثناء وقت الترجمة. [ 58 ] قد تدعم لغة البرمجة أو المكتبة أيضًا كائناتٍ وصفيةً أوليةً أو مصنعيةً تُمثل معلوماتٍ وقت التشغيل حول الأصناف، أو حتى تُمثل بياناتٍ وصفيةً تُتيح الوصول إلى إمكانيات البرمجة الانعكاسية (الانعكاس) والقدرة على معالجة تنسيقات هياكل البيانات أثناء وقت التشغيل. تُميز العديد من اللغات هذا النوع من معلومات وقت التشغيل حول الأصناف عن الصنف نفسه، على أساس أن هذه المعلومات غير مطلوبة أثناء وقت التشغيل. بعض اللغات الديناميكية لا تُفرّق بشكلٍ صارمٍ بين بنيات وقت التشغيل ووقت الترجمة، وبالتالي قد لا تُفرّق بين الكائنات الوصفية والأصناف.

على سبيل المثال، إذا كان Human كائنًا فوقيًا يمثل فئة Person، فيمكن إنشاء مثيلات من فئة Person باستخدام إمكانيات الكائن الفوقي Human .

البرمجة القائمة على الفصول الدراسية

البرمجة القائمة على الأصناف ، أو البرمجة الموجهة نحو الأصناف بشكل أكثر شيوعًا ، هي نمط من أنماط البرمجة الكائنية التوجه، حيث تُنشأ جميع الكائنات بواسطة صنف واحد دون وجود وراثة بينها. [ 59 ] [ 60 ]

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

التغليف

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

نقد

تُنتقد لغات البرمجة القائمة على الأصناف، أو بتعبير أدق، اللغات المكتوبة ، حيث يُعدّ التوريث الطريقة الوحيدة للتصنيف الفرعي ، لخلطها بين التطبيقات والواجهات - وهو المبدأ الأساسي في البرمجة كائنية التوجه. يقول النقاد إنه يمكن إنشاء صنف "حقيبة" لتخزين مجموعة من الكائنات، ثم توسيعه لإنشاء صنف جديد يُسمى صنف "مجموعة" حيث يتم التخلص من تكرار الكائنات. [ 61 ] [ 62 ] الآن، قد تتوقع دالة تأخذ كائنًا من صنف "الحقيبة" أن إضافة كائنين ستزيد حجم الحقيبة بمقدار اثنين، ولكن إذا تم تمرير كائن من صنف "المجموعة"، فإن إضافة كائنين قد تزيد حجم الحقيبة بمقدار اثنين أو لا. تنشأ المشكلة تحديدًا لأن التوريث يستلزم التصنيف الفرعي حتى في الحالات التي لا ينطبق فيها مبدأ التصنيف الفرعي، المعروف بمبدأ استبدال ليسكوف . وقد صاغت باربرا ليسكوف وجانيت وينغ هذا المبدأ بإيجاز في ورقة بحثية عام 1994 على النحو التالي:

متطلبات النوع الفرعي : دعϕ(x){\displaystyle \phi (x)}أن تكون خاصية قابلة للإثبات حول الكائناتx{\displaystyle x}من النوعتي{\displaystyle T}ثمϕ(y){\displaystyle \phi (y)}ينبغي أن يكون هذا صحيحًا بالنسبة للكائناتy{\displaystyle y}من النوعS{\displaystyle S}أينS{\displaystyle S} هو نوع فرعي منتي{\displaystyle T} .

لذا، عادةً ما يجب التمييز بين التوريث الفرعي والتصنيف الفرعي. معظم لغات البرمجة الكائنية الحديثة تميز بين التوريث الفرعي والتصنيف الفرعي، إلا أن بعض مناهج التصميم لا تفعل ذلك.

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

لغات مثال

Although Simula introduced the class abstraction, the canonical example of a class-based language is Smalltalk. Others include PHP, C++, Java, C#, and Objective-C.

Prototype-based programming

In contrast to creating an object from a class, some programming contexts support object creation by copying (cloning) a prototype object.[63]

See also

  • Block (programming) – Demarcated group of source code statements that run in sequence
  • Class diagram – Diagram that describes the static structure of a software system
  • Class invariant – Unchanging property for all objects of a class
  • Class variable – Variable defined in a class whose objects all possess the same copy
  • Function (computer science) – Sequence of program instructions invokable by other softwarePages displaying short descriptions of redirect targets
  • Instance variable – Member variable of a class that all its objects possess a their own copy of
  • Metaclass – Class that describes common behavior for classes
  • Object (computer science) – Semantic instance with state, behavior, and identity
  • Syntax (programming language) – Form of source code, without regard to meaningPages displaying short descriptions of redirect targets
  • Variable (computer science) – Named container for a particular type of dataPages displaying short descriptions of redirect targets

Notes

  1. 12345Dahl, Ole-Johan; Myhrhaug, Bjørn; Nygaard, Kristen (1970). Common Base Language(PDF) (Report). Norwegian Computing Center. Archived from the original on 2024-09-19. Retrieved 20 August 2025.
  2. Gamma et al. 1995, p. 14.
  3. Bruce 2002, 2.1 Objects, classes, and object types, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
  4. Gamma et al. 1995, p. 17.
  5. 12"3. Data model". The Python Language Reference. Python Software Foundation. Retrieved 2012-04-26.
  6. Booch 1994, p. 86-88.
  7. "Classes (I)". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-29.
  8. "الصفوف (٢)" . دليل لغة C++ . cplusplus.com . تم الاطلاع عليه بتاريخ ٢٩-٠٤-٢٠١٢ .
  9. بوتش 1994 ، ص 105.
  10. بارسونز، جون جامريش (22-06-2015). وجهات نظر جديدة حول مفاهيم الحاسوب 2016، شاملة . بوسطن، ماساتشوستس: سينجايج ليرنينج. ISBN 9781305271616. OCLC 917155105 . 
  11. 1 2 "التحكم في الوصول إلى أعضاء فئة" . دروس جافا . أوراكل . تم الاسترجاع في 19-04-2012 .
  12. "OOP08-CPP. لا تُرجع مراجع إلى بيانات خاصة" . معيار CERT للبرمجة الآمنة بلغة C++ . جامعة كارنيجي ميلون. 10 مايو 2010. مؤرشف من الأصل في 3 أكتوبر 2015. تم الاطلاع عليه في 7 مايو 2012 .
  13. بن آري، مردخاي (24 يناير 2007). "2.2 المعرّفات" (ملف PDF) . أخطاء الترجمة والتشغيل في جافا . مؤرشف (ملف PDF) من الأصل بتاريخ 18 أكتوبر 2011. تم الاطلاع عليه بتاريخ 7 مايو 2012 .
  14. 1 2 وايلد، فريد. "واجهات C++" . دكتور دوبز . يو بي إم تك ويب . تم الاسترجاع في 2012-05-02 .
  15. "modules_and_classes: Visibility" .
  16. "الصداقة والوراثة" . دليل لغة C++ . cplusplus.com . تاريخ الاسترجاع: 26-04-2012 .
  17. بيرفيلد، ماريا (2 ديسمبر 2008). "تحويل لغة النمذجة الموحدة (UML) إلى لغة جافا في إصدارات برنامج IBM Rational Software Architect والبرامج ذات الصلة" . شركة IBM . تم الاطلاع عليه بتاريخ 20 ديسمبر 2013 .
  18. ^ جاكوبسن، إيفار. ماغنوس كريسترسون؛ باتريك جونسون؛ غونار أوفرجارد (1992). هندسة البرمجيات الشيئية . مطبعة أديسون ويسلي ACM. ص 43-69 . رقم ISBN  0-201-54435-0.
  19. كنوبلاوخ، هولجر؛ أوبرلي، دانيال؛ تيتلو، فيل؛ والاس، إيفان (9 مارس 2006). "مقدمة في الويب الدلالي لمطوري البرمجيات الموجهة للكائنات" . اتحاد شبكة الويب العالمية . تم الاطلاع عليه بتاريخ 30 يوليو 2008 .
  20. بوتش 1994 ، ص 180.
  21. Booch 1994 ، ص 128-129.
  22. بوتش 1994 ، ص 112.
  23. 1 2 "الواجهات" . دروس جافا . أوراكل . تم الاسترجاع في 1 مايو 2012 .
  24. 1 2 بيل، دونالد. "أساسيات لغة النمذجة الموحدة: مخطط الفئات" . أعمال المطورين . آي بي إم . تم الاسترجاع في 2 مايو 2012 .
  25. بوتش 1994 ، ص 179.
  26. 1 2 "تعدد الأشكال" . دليل لغة C++ . cplusplus.com . تم الاطلاع عليه بتاريخ 2012-05-02 .
  27. "الأساليب والفئات المجردة" . دروس جافا . أوراكل . تم الاسترجاع في 2012-05-02 .
  28. "تجريد الفئات" . دليل PHP . مجموعة PHP . تم الاطلاع عليه بتاريخ 2012-05-02 .
  29. "الواجهات (دليل برمجة C#)" . دليل برمجة C# . مايكروسوفت . تم الاطلاع عليه بتاريخ 15 أغسطس 2013 .
  30. "الوراثة (دليل برمجة C#)" . دليل برمجة C# . مايكروسوفت . تم الاطلاع عليه بتاريخ 2012-05-02 .
  31. "الفئات المتداخلة (لغة C++ فقط)" . XL C/C++ الإصدار 8.0 لنظام AIX . شركة IBM . تاريخ الاسترجاع: 7 مايو 2012 .
  32. "أسماء الأنواع المحلية (لغة C++ فقط)" . XL C/C++ الإصدار 8.0 لنظام AIX . شركة IBM . تاريخ الاسترجاع: 7 مايو 2012 .
  33. "الفئات المحلية (لغة C++ فقط)" . XL C/C++ الإصدار 8.0 لنظام AIX . شركة IBM . تاريخ الاسترجاع: 7 مايو 2012 .
  34. Booch 1994 ، ص 133-134.
  35. "13 فئة وفئات فوقية" . pharo.gforge.inria.fr . مؤرشف من الأصل بتاريخ 24-02-2021 . تم الاطلاع عليه بتاريخ 31-10-2016 .
  36. "class Class" .
  37. بوتش 1994 ، ص 134.
  38. "MOP: المفاهيم" . بروتوكول الكائنات الوصفية لنظام كائنات Common Lisp . رابطة مستخدمي Lisp. مؤرشف من الأصل بتاريخ 15-11-2010 . تم الاطلاع عليه بتاريخ 08-05-2012 .
  39. "مختوم (مرجع C#)" . مرجع C# . مايكروسوفت . تم الاسترجاع في 2012-05-08 .
  40. "كتابة الفئات والأساليب النهائية" . دروس جافا . أوراكل . تم الاسترجاع في 8 مايو 2012 .
  41. "PHP: الكلمة المفتاحية النهائية" . دليل PHP . مجموعة PHP . تم الاطلاع عليه بتاريخ 21-08-2014 .
  42. "الفئات المغلقة" . مركز مساعدة أوراكل . تم الاطلاع عليه بتاريخ 2025-07-07 .
  43. فريق العمل (15 ديسمبر 2025). "الإرث" . Kotlinlang.org . JetBrains sro
  44. "سلسلة (منصة جافا SE 7)" . منصة جافا، الإصدار القياسي 7: مواصفات واجهة برمجة التطبيقات . أوراكل . تم الاسترجاع في 8 مايو 2012 .
  45. براند، سي (2 مارس 2020). "فوائد الأداء للفئات النهائية" . مدونة فريق مايكروسوفت سي++ . مايكروسوفت . تم الاطلاع عليه في 4 أبريل 2020 .
  46. "الصفوف المغلقة" . docs.oracle.com . مركز مساعدة أوراكل . تم الاطلاع عليه بتاريخ 16 أكتوبر 2025 .
  47. شركة أوراكل. "4 - الفئات المغلقة" . docs.oracle.com . شركة أوراكل . تم الاطلاع عليه في 7 يونيو 2026 .
  48. "9. الفئات" . دليل بايثون التعليمي . Python.org . تم الاطلاع عليه في 3 مارس 2018. كما هو الحال بالنسبة للوحدات، فإن الفئات تشارك في الطبيعة الديناميكية لبايثون: يتم إنشاؤها في وقت التشغيل، ويمكن تعديلها لاحقًا بعد إنشائها.
  49. 1 2 mairaw؛ BillWagner؛ tompratt-AQ (2015-09-19)، "الفئات والأساليب الجزئية" ، دليل برمجة C# ، مايكروسوفت ، تم الاطلاع عليه بتاريخ 2018-08-08
  50. "الفئات والأعضاء الجزئية - لغة C#" .
  51. بيل واغنر (14 نوفمبر 2024). "الفئات والأساليب الجزئية - لغة سي شارب" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 6 فبراير 2025 .
  52. "الفئات الثابتة وأعضاء الفئات الثابتة (دليل برمجة C#)" . دليل برمجة C# . مايكروسوفت . تم الاطلاع عليه بتاريخ 8 مايو 2012 .
  53. "الفئات المجهولة (دروس جافا > تعلم لغة جافا > الفئات والكائنات)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 13-05-2021 .
  54. "PHP: الفئات المجهولة - دليل المستخدم" . www.php.net . تم الاطلاع عليه بتاريخ 11 أغسطس 2021 .
  55. "ما هو الكائن؟" . oracle.com . شركة أوراكل . تم الاطلاع عليه بتاريخ 13 ديسمبر 2013 .
  56. بوش، جرادي؛ روبرت أ. ماكسيمتشوك؛ مايكل و. إنجل؛ بوبي ج. يونغ، دكتوراه؛ جيم كونالين؛ كيلي أ. هيوستن (30 أبريل 2007). التحليل والتصميم الموجه للكائنات مع التطبيقات . أديسون-ويسلي بروفيشنال. الصفحات 1-28 . ISBN  978-0-201-89551-3تم الاطلاع عليه بتاريخ 20 ديسمبر 2013. هناك عوامل أساسية تحد من الإدراك البشري؛ ويمكننا معالجة هذه القيود من خلال استخدام التفكيك والتجريد والتسلسل الهرمي.
  57. ^ جاكوبسن، إيفار. ماغنوس كريسترسون؛ باتريك جونسون؛ غونار أوفرجارد (1992). هندسة البرمجيات الشيئية . مطبعة أديسون ويسلي ACM. رقم ISBN 0-201-54435-0.
  58. "المعيار الدولي للغة C++" (ملف PDF) . مسودة عمل، معيار لغة البرمجة C++ . ISO/IEC JTC1/SC22 WG21. مؤرشف (ملف PDF) من الأصل بتاريخ 9 ديسمبر 2017. تم الاطلاع عليه بتاريخ 5 يناير 2020 .
  59. فيجنر، بيتر (1987). "أبعاد تصميم لغات البرمجة الكائنية" . وقائع مؤتمر أنظمة ولغات وتطبيقات البرمجة الكائنية . ص 168-182 . doi : 10.1145/38765.38823 . ISBN  0-89791-247-0.
  60. ليسكوف، باربرا (1996). "تاريخ لغة CLU" . تاريخ لغات البرمجة - الجزء الثاني . ص 471-510 . doi : 10.1145/234286.1057826 . ISBN  0-201-89502-1.
  61. كيسليوف، أوليغ. "التصنيف الفرعي، والتصنيف الفرعي، ومشاكل البرمجة الكائنية التوجه" . تم الاطلاع عليه بتاريخ 7 أكتوبر 2012 .
  62. دوكاس، ستيفان. "لا يمكن أن تكون المجموعة نوعًا فرعيًا من الحقيبة" . تم الاطلاع عليه بتاريخ 7 أكتوبر 2012 .
  63. أمير، مسرور (25 مارس 2023). "البرمجة الكائنية التوجه - المفاهيم | اللغات | الفوائد [ 2023 ] " . موقع جيكس بوت: موقع علوم حاسوب للمهتمين بالتكنولوجيا . تم الاطلاع عليه بتاريخ 4 أبريل 2023 .

مراجع

للمزيد من القراءة