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
  • Entity: TeachingStaff

    • TeachingStaff Attributes: Id, Name, Address, Phone, Designation, Salary, Qualification, Subject
  • Entity: NonTeachingStaff

    • NonTeachingStaff Attributes: Id, Name, Address, Phone, Designation, Salary, DeptName, ManagerId

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?

عمومًا، لما بنطور تطبيق، بنتبع عملية زي دي:

  1. حدد الـ entity المرتبط بالتطبيق.
  2. حدد الـ attribute المرتبط بالتطبيق.
  3. افصل الـ attribute بتاعت كل entity في ترتيب هرمي (hierarchical order) من غير أي تكرار.
  4. حوّل الـ entities دي لـ classes.

Another Realtime Example to Understand Inheritance in C#

اكتساب خصائص class موجود (الـ base class) في class جديد (الـ derived class) هو ده الـ inheritance. الـ Inheritance هو إنك تشتق class من class موجود. خلونا نفهم ده بمثال من الواقع. هناخد مثال من هندسة السيارات. افترض إن شركة عربيات صممت عربية.

ده مجرد تصميم. بناءً على التصميم ده، صنعوا عربية فعلية. وباعوا عربيات كتير في السوق. التصميم ده ناجح.

دلوقتي الشركة بتحاول تعمل موديل جديد من نفس العربية. طيب، هل تفتكر إنهم لازم يعملوا شغل التصميم من الأول تاني أو من الصفر؟ لأ، هما يقدروا ياخدوا نفس الخصائص في التصميم الجديد.

ده تصميم جديد. كل الخصائص متاخدة من التصميم اللي فات واتضافت عليها خصائص زيادة. يعني عشان يعملوا موديل جديد شبه الأولاني، مش محتاجين يعيدوا شغل التصميم. بس يقدروا يوسعوا (extend) التصميم الموجود ويضيفوا خصائص جديدة عليه عشان يطلعوا بتصميم جديد. ده مثال على الـ inheritance. اكتساب خصائص تصميم موجود في تصميم جديد هو ده الـ inheritance.

ملاحظة: دي مهمة ليك إنك تصمم الـ classes للمثال اللي فات وتحطها في قسم التعليقات.