الوحدة 4: الوراثة وتعدد الأشكال والتجريد · الموضوع 8 من 17
الموضوع 8

الوراثة Inheritance

نبني كلاسًا جديدًا على كلاس موجود، فيرث خصائصه ودواله ونضيف إليه ما يخصّه.

EmployeeProgrammerManagerextends
بعد هذا الدرس ستستطيع أن:
  • تعرّف الوراثة، وتميّز بين الكلاس الأب superclass والكلاس الابن subclass.
  • تبني كلاسًا يرث كلاسًا آخر باستخدام extends.
  • تحدد الأعضاء التي يرثها الكلاس الابن حسب محددات الوصول.
  • تستخدم super لاستدعاء دالة بناء الأب أو الوصول إلى أعضائه.
  • تتتبّع ترتيب تنفيذ دوال البناء في الوراثة المتتالية.

١ما هي الوراثة؟

إمكانية بناء كلاس جديد على أساس كلاس موجود. الابن يرث كل خصائص الأب ودواله (المسموح بها)، ثم نضيف إليه ما يحتاجه.
الكلاس المورِّثالكلاس الوارث
Superclass · Parent · BaseSubclass · Child · Derived · Extended
الأب، الأساس، الفئة العلويةالابن، المشتق، الفئة الفرعية
snippet
class A {} class B extends A {   // B يرث من A}

٢لماذا نحتاجها؟ مثال الموظفين

Programmer~ name : String~ address : String~ phoneNumber : String~ experience : float~ programmingLanguages : String[]~ writeCode() : voidManager~ name : String~ address : String~ phoneNumber : String~ experience : float~ teamSize : int~ reportProjectStatus() : void
🧩 قبل الوراثة: name و address و phoneNumber و experience مكرّرة في الكلاسين.
Employee~ name : String~ address : String~ phoneNumber : String~ experience : floatProgrammer~ programmingLanguages : String[]~ writeCode() : voidManager~ teamSize : int~ reportProjectStatus() : void
🧩 بعد الوراثة: المشترك في Employee مرة واحدة، وكل ابن يضيف ما يخصّه. السهم برأس مثلث فارغ يعني «يرث من» extends.
Employees.java
class Employee {    String name;    String address;    String phoneNumber;    float experience;}class Programmer extends Employee {    String[] programmingLanguages;    void writeCode() {}}class Manager extends Employee {    int teamSize;    void reportProjectStatus() {}}
Employee~ facebookId~ name~ address~ phoneNumber~ experienceAstronaut~ hoursInSpaceDoctor~ surgeryProgrammer~ programmingLanguages~ writeCode()Manager~ teamSize~ reportProjectStatus()
🧩 تقليل التكرار وسهولة التعديل: أربعة أنواع من الموظفين تشترك في Employee، وإضافة facebookId لهم جميعًا تكون في مكان واحد.
♻️ إعادة استخدام الكودالمشترك يُكتب مرة واحدة في الأب.
✂️ تكرار أقللا نعيد name و address في كل كلاس.
🔧 تعديل أسهلإضافة خاصية لكل الموظفين = تعديل الأب فقط.

٣ماذا يُورث؟

عضو الأبفي الحزمة نفسهافي حزمة أخرى
private✗✗
default✓✗
protected✓✓
public✓✓

٤الكلمة super

A.java
class A{    public void printName()    {        System.out.println("A");    }} class B extends A{    public void printName()    {        System.out.println("B");        super.printName();    }} public class Main{    public static void main(String[] args)    {        B obj = new B();        obj.printName();    }}
Output – JavaApplication (run)×
run:
B
A
BUILD SUCCESSFUL (total time: 0 seconds)

ترتيب دوال البناء: الجد ثم الأب ثم الابن

🔎 تتبّع: من يُنفَّذ أولًا عند new C()؟
A.java
class A{    public A()    {        System.out.println("Hello, I am the class A");    }} class B extends A{    public B()    {        System.out.println("Hi, I am the class B");    }} class C extends B{    public C()    {        System.out.println("I am the class C");    }} public class Main{    public static void main(String[] args)    {        C obj = new C();    }}
Variables · المتغيّرات في الذاكرة
Output×

٥أشكال الوراثة

وراثة مفردة SingleAB متعدّدة المستويات MultilevelABC هرمية HierarchicalABC
الأشكال الثلاثة مدعومة في جافا: فردية، ومتتالية، وهرمية. أما الوراثة المتعددة Multiple (كلاس يرث كلاسين معًا) فلا تدعمها جافا.
✗ خطأ
snippet
class C extends A, B {}
✓ صواب
snippet
class B extends A { }class C extends B { }

جافا لا تسمح بالوراثة من كلاسين معًا. البديل الوراثة المتتالية، أو الواجهات interface في درس التجريد.

التدريب العملي 11: المبرمج يرث الموظفEmployee بخاصية salary محمية بشرط، و Programmer يرثه ويضيف لغات البرمجة.افتح التدريب ← التدريب العملي 12: super ودوال البناءA الأب و B الابن: استدعاء دالة بناء الأب بـ super، والتفريق بين age في الكلاسين.افتح التدريب ←

توقّع وتحقّق

أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.

الكلمة التي تجعل كلاسًا يرث آخر:

تأمل الكود التالي،

snippet
class A {    A() { System.out.print("A "); }}class B extends A {    B() { System.out.print("B "); }}class C extends B {    C() { System.out.print("C "); }} // main داخل الدالةnew C();

ماذا سيكون الناتج عند تنفيذ السطر الأخير؟

عند إنشاء كائن من C تُستدعى دالة بناء الأب أولًا: A ثم B ثم C.

عضو private في الأب:

أين يُكتب super(name);؟

الخلاصة

انتقل إلى تقييم الدرسأسئلة التقييم، وأكمل الفراغات.ابدأ التقييم ←