Introduction
في المقال ده، هتكلم عن إزاي نستخدم الـ Inheritance في تطوير التطبيقات بمثال باستخدام لغة C#. يا ريت تقرا المقالين اللي فاتوا قبل ما تكمل هنا. فيهم اتكلمنا عن إيه هو الـ inheritance، وقواعده المختلفة، وإزاي نطبقه في C#، وأنواع الـ Inheritance المختلفة اللي C# بتدعمها مع الـ classes.
What is Inheritance in C#?
عملية إنشاء class جديد من class موجود أصلًا بحيث الـ class الجديد ياخد كل الخصائص (properties) والسلوكيات (behaviors) بتاعة الـ class الموجود بتتسمى inheritance.
- الـ
classاللي الخصائص بتتنقل منه بيتسمىsuperclassأوparent classأوbase class. - الـ
classاللي بيورث الخصائص من الـsuperclassبيتسمىsubclassأوchild classأوderived class.
بكلمات أبسط، inheritance معناه إنك تاخد حاجة معمولة أصلًا (أو متاحة).
الـ Inheritance هو المفهوم اللي بنستخدمه عشان إعادة استخدام الكود (code reusability) وقابلية التغيير (changeability). وهنا changeability معناها إنك تعدل على وظيفة موجودة (overriding) أو تضيف وظائف جديدة للـ object.
How to use Inheritance in Application Development?
الـ Inheritance ده حاجة بتظهر في الصورة مش في نص المشروع أو في نص تطوير التطبيق. ممكن تيجي في النص، بس عمومًا لما بنبدأ تطوير التطبيق، في المراحل الأولية بس بنخطط للـ Inheritance ونطبقه في مشروعنا.
What is an Entity?
في مصطلحات الـ DBMS، إيه هو الـ Entity؟ الـ Entity (الكيان) هو أي حاجة مرتبطة بمجموعة من الخصائص (attributes). الـ Entity ممكن يكون كائن حي أو غير حي. لكن أي حاجة مرتبطة بمجموعة attributes بتتسمى Entity.
افتكر، لما بنيجي نطور تطبيق، تطبيقنا بيتعامل بشكل أساسي مع الـ Entities دي.
- افترض إنك بتطور تطبيق لبنك. الـ
Entityالمرتبط بالبنك هو العميل (customer). العميلEntity. - بتطور تطبيق لمدرسة؛ الطالب (
Student) هيبقى هو الـEntity. - بتطور تطبيق لبيزنس، الموظف (
Employee) هو الـentity.
فكل تطبيق بنطوره بيكون مرتبط بمجموعة من الـ entities.
هل نقدر نسمي التليفون Entity؟ أيوه، نقدر. هو مش كائن حي بس ممكن نسميه entity. ليه شوية attributes زي الشركة اللي صنعته، ورقم الموديل، والسعر، والحجم، والوزن، إلخ.
الطالب هو Entity حي. كل الطلبة ليهم شوية attributes زي Id, Name, Address, Phone number، والفصل اللي الطالب بيدرس فيه.
الموظف هو Entity حي. الموظفين ليهم شوية attributes زي رقم الموظف، والاسم، والوظيفة، والقسم، والمرتب، إلخ.
Application Development Process
عمومًا، لما بنيجي نطور تطبيق، العملية بتبقى كالتالي:
Step1: Identify the Entities that are associated with the application
افترض إننا بنطور تطبيق لمدرسة. مين هما الـ entities للتطبيق ده؟
- الطالب (
Student) هوEntity. - هيئة التدريس (
TeachingStaff) هوEntity. - الهيئة غير التدريسية (
NonTeachingStaff) هوEntityتاني.
بالشكل ده، نقدر نحدد الـ entities. في تطبيقنا، حددنا تلاتة entities.
Entities: Student, TeachingStaff, NonTeachingStaff
Step2: Identify the attributes of each and every entity
-
Entity: Student
- Student Attributes:
Id,Name,Address,Phone,Class,Marks,Grade,Fees
- Student Attributes:
-
Entity: TeachingStaff
- TeachingStaff Attributes:
Id,Name,Address,Phone,Designation,Salary,Qualification,Subject
- TeachingStaff Attributes:
-
Entity: NonTeachingStaff
- NonTeachingStaff Attributes:
Id,Name,Address,Phone,Designation,Salary,DeptName,ManagerId
- NonTeachingStaff Attributes:
Step3: Identify the common attributes and put them in a hierarchical order
الـ Person فيه أربع خصائص: Id, Name, Address, Phone. تحت الـ Person، عندنا Student و Staff.
- الـ
Studentبيورث من الـPerson، فبشكل افتراضي الـStudentهياخد الأربع خصائص دول، وباقي الخصائص التانية متعرفة جوه الـStudent Entityنفسه. - بعدين عندنا
Staff Entityاللي هو كمان بيورث منPerson، وبالتالي الأربع خصائص المشتركة دي متاحة فيه، بالإضافة لإننا عرفنا الخصائص المشتركة بين الـTeachingوالـNonTeachingجوه الـStaff entity. فـStaffهيبقى فيه ست خصائص. - أخيرًا،
TeachingوNonTeachingالاتنين بيورثوا من الـStaff Entity.
graph TD Person --> Student Person --> Staff Staff --> Teaching Staff --> NonTeaching
بالطريقة دي، لو بكرة ظهر نوع جديد زي temporary staff، الخصائص دي هتنطبق عليه برضه. كل اللي هتحتاج تعمله هو إنك تنشئ Entity جديد بالخصائص المحددة بتاعته وتخليه يورث من الـ Staff entity.
Step4: Defining the classes that are representing the entities in Hierarchical order
بعد ما حددنا خصائص كل entity، الخطوة الجاية هي إننا نعرّف classes بتمثل كل entity. يعني class بيمثل الطلبة، وclass بيمثل هيئة التدريس، وclass تالت بيمثل الهيئة غير التدريسية.
لكن لو عرفنا تلاتة classes بيمثلوا كل entity لوحده، هيبقى فيه مشكلة. المشكلة هي إن فيه شوية attributes مشتركة في كل entity. فلو بدأنا نعرّف تلاتة classes بشكل فردي، هيحصل تكرار في الكود (code duplication). ليه؟ لإننا هنحتاج نعرّف Id تلات مرات، وName تلات مرات، وAddress تلات مرات، وPhone number تلات مرات.
وإحنا شغالين بلغة برمجة شيئية (object-oriented)، مش لغة إجرائية (procedure-oriented). وقوة لغات البرمجة الشيئية هي إعادة استخدام الكود (code re-usability)، مش تكرار الكود. لو منقدرش نستفيد من إعادة الاستخدام، يبقى مفيش داعي نستخدم البرمجة الشيئية أصلًا.
فاللي محتاجين نعمله هو إننا نشيل التكرار. في اللغات الإجرائية، بنستخدم structure عشان نمثل الـ entity. في الـ DBMS بنستخدم tables، وفي البرمجة الشيئية بنستخدم classes.
للأسف، الـ structure مش بيدعم الـ inheritance. عشان كده، هحتاج أعرّف تلاتة entities بخصائص متكررة. ده ضد معايير البرمجة الشيئية تمامًا.
إيه هي الخصائص المشتركة بين التلاتة entities؟ هما Id, Name, Address, Phone. خلونا نحط الخصائص المشتركة دي في class اسمه Person. بمجرد ما نعرّف الـ class ده ونخليه Parent class، مش هنحتاج نعرّف الخصائص دي تلات مرات. هنعلن عنها مرة واحدة في الـ parent class وبعدين نستخدم الخصائص دي في كل الـ child classes. وبكده إعادة الاستخدام (reusability) بتدخل في الصورة.
public class Person
{
public int Id;
public string Name;
public string Address;
public string Phone;
}دلوقتي نقدر نعرّف class اسمه Student بيورث من Person class. وفي student class، هنحتاج نعرّف بس الخصائص Class, Marks, Grade, Fees لإن Id, Name, Address, Phone جايين من Person parent class.
public class Student : Person
{
public int Class;
public float Fees;
public float Marks;
public char Grade;
}بعد كده، لو بصيت على TeachingStaff وNonTeachingStaff، هتلاقي بجانب الأربع خصائص المشتركة، فيه خاصيتين تانيين مشتركين وهما Designation و Salary. مرة تانية، لو حطينا الخاصيتين دول في كل class لوحده، هيحصل تكرار.
الحل هو إننا ننشئ class منفصل، نسميه Staff، والـ class ده هيورث من Person class. في الـ class ده، هنحط الخاصيتين المشتركين Designation وSalary. دلوقتي Staff class بقى فيه 6 attributes، أربعة جايين من Person class واتنين متعرفين فيه هو نفسه.
public class Staff : Person
{
string Designation;
double Salary;
}دلوقتي، لو خلينا Staff class هو parent class للـ TeachingStaff والـ NonTeachingStaff، فبشكل افتراضي ست خصائص هتيجي معاهم.
- في
TeachingStaff، هنحتاج نعرّف بس الخصائص الخاصة بيه زيQualificationوSubject. - في
NonTeachingStaff، هنحتاج نعرّف بس الخصائص الخاصة بيه زيDeptNameوManagerId.
والاتنين هيورثوا من Staff class. دلوقتي مش هنسميهم TeachingStaff و NonTeachingStaff، هنسميهم Teaching وNonTeaching لإنهم بيورثوا من Staff.
public class Teaching : Staff
{
string Qualification;
string Subject;
}
public class NonTeaching : Staff
{
string Deptname;
string ManagerId;
}فدي المفروض تكون العملية بتاعة إزاي تطبق الـ Inheritance في تطوير التطبيقات.
How to Make use of Inheritance in Realtime Application Development?
عمومًا، لما بنطور تطبيق، بنتبع عملية زي دي:
- حدد الـ
entityالمرتبط بالتطبيق. - حدد الـ
attributeالمرتبط بالتطبيق. - افصل الـ
attributeبتاعت كلentityفي ترتيب هرمي (hierarchical order) من غير أي تكرار. - حوّل الـ
entitiesدي لـclasses.
Another Realtime Example to Understand Inheritance in C#
اكتساب خصائص class موجود (الـ base class) في class جديد (الـ derived class) هو ده الـ inheritance. الـ Inheritance هو إنك تشتق class من class موجود. خلونا نفهم ده بمثال من الواقع. هناخد مثال من هندسة السيارات. افترض إن شركة عربيات صممت عربية.
ده مجرد تصميم. بناءً على التصميم ده، صنعوا عربية فعلية. وباعوا عربيات كتير في السوق. التصميم ده ناجح.
دلوقتي الشركة بتحاول تعمل موديل جديد من نفس العربية. طيب، هل تفتكر إنهم لازم يعملوا شغل التصميم من الأول تاني أو من الصفر؟ لأ، هما يقدروا ياخدوا نفس الخصائص في التصميم الجديد.
ده تصميم جديد. كل الخصائص متاخدة من التصميم اللي فات واتضافت عليها خصائص زيادة. يعني عشان يعملوا موديل جديد شبه الأولاني، مش محتاجين يعيدوا شغل التصميم. بس يقدروا يوسعوا (extend) التصميم الموجود ويضيفوا خصائص جديدة عليه عشان يطلعوا بتصميم جديد. ده مثال على الـ inheritance. اكتساب خصائص تصميم موجود في تصميم جديد هو ده الـ inheritance.
ملاحظة: دي مهمة ليك إنك تصمم الـ classes للمثال اللي فات وتحطها في قسم التعليقات.