recent
أخبار ساخنة

الوراثة inheritance في لغة جافا JAVA الدرس |25|

الصفحة الرئيسية


الوراثة inheritance

كما هو الحال المتعارف عليه في ارض الواقع أن يرث الإبن من أبيه بعض الصفات او من أمه بعض الصفات, نفس الأمر لدينا في الأوبجكت اورنتد object oriented programming في مفهوم الوراثة و هو أن يرث كلاس من كلاس آخر بحيث أن الكلاس الوارث يسمى الإبن و الكلاس المورث يسمى الأب بحيث يستطيع الإبن الوصول لكافة الدوال و المتغيرات الموجودة في الكلاس الأب و إعادة إستخدامها مرة أخرى ما عدا المتغيرات المحمية الخاصة بالكلاس الأب.

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

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

لنفترض أنه لدينا كلاس إسمه c و كلاس اسمه A و لجعل الكلاس A يرث من الكلاس c نستخدم الكلمة المحجوزة extends يعني أن A يرث من c و يعني أصبح A هو الإبن و ال c هو الأب, الآن يستطيع الكلاس A أن يصل لجميع المتغيرات و الدوال الذي في أبيه, و يكون كالتالي.

package a;
class c
{
    
}
public class A extends c {

     public static void main(String []args){
         
        System.out.println("Hello World");
     }
}

 

مثال 1

package a;
class c
{
    private int x1=6; 
    protected int x2=7;
    public int x3=10;
}
public class A extends c {

     public static void main(String []args){
         A ob1=new A();
        System.out.println(ob1.x2);
     }
}

 

و النتيجة

 

شرح المثال السابق 1

نلاحظ عند التنفيذ لهذا البرنامج أننا قمنا بالوصول لقيمة المتغير x2 كما طلبنا منه و طبعها بواسطة الكائن ob و نستطيع ايضاً الوصول لقيمة x3 بنفس الأمر لكن قيمة المتغير x1 لا نستطيع الوصول لها لأنه محمي.


مثال 2

نفترض أننا لدينا مصنع سيارات و هو يمتلك نوعين model A و model B.

package model_a;

class Model_B
{
    int speed;
    int size;
    String Model;
}
public class Model_A {
    int speed;
    int size;
    String Model;
    public static void main(String []args){
     }
}

 

شرح المثال السابق 2

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

 

مثال 3

package model_a;
class car
{
    int speed;
    int size;
    String Model;
}
class Model_B extends car
{
}
public class Model_A extends car{
    public static void main(String []args){
        Model_A A=new Model_A();
        Model_B B=new Model_B();
        A.speed=200;
        B.speed=250;
        System.out.println(A.speed);
        System.out.println(B.speed);
     }
}

 

و النتيجة

 

شرح المثال السابق 3

لقد أنشأنا كلاس أب إسمه car و كان به ثلاث متغيرات إثنان متغيرات عددية و الأخير متغير نصي و هي لمواصفات سيارات موجودة في هذا المعرض, يعني قمنا بتعريف الخصائص المشتركة في الكلاسين التي هي الدوال و المتغيرات المتشابهة المكررة في كل كلاس و وضعناهم بكلاس أب ثم جعلنا بقية الكلاسات ترث من الكلاس الأب و هو الكلاس Model_B ورث من الكلاس الأب و ثم الكلاس Model_A ايضاً أورثناه من الأب الذي هو car و هذا الكلاس أصبح يصل لكافة المتغيرات و الدوال ما عدا المتغيرات المحمية و هنا تم إختصار الكود عوضاً عن ما كان به بالمثال السابق و إختصرنا الكود و حررنا مساحة كبيرة في الذاكرة, ثم دخلنا للبرنامج الرئيسي, سنقوم بإنشاء كائن من كل كلاس حتى يستطيع الوصول للمتغيرات و الدوال الموجودة في الأب و إعادة إستخدامها وقت الحاجة, الكلاسات هي Model_A A و الكلاس Model_B B و الآن أصبح بالإمكان الوصول للمتغيرات و الدوال الموجودة في الأب ثم طبعناهم.


الوراثة الهرمية Hierarchical inheritance

تحدثنا في بداية الدرس بأن الكلاس الوارث يسمى الكلاس الإبن و الكلاس المورّث يسمى الكلاس الأب, نفس المفهوم هنا لكن سنتفرع قليلاً, سيكون لدينا وراثة هرمية بحيث يكون لدينا كلاس جد و كلاس إبن و كلاس حفيد, و لب الموضوع بهذه الفقرة هو هل يستطيع الكلاس الحفيد الوصول إلى متغيرات و دوال كلاس الجد.

 

مثال 4

package model_a;
class A
{
    
}
class B extends A   {
    
}

public class C extends B{  

     public static void main(String []args){
        System.out.println("Hello World");
     }
}

 

شرح المثال السابق 4

كما نلاحظ من خلال الكود السابق بأنه يحتوي على ثلاث كلاسات و هي الكلاس A و الكلاس B و الكلاس C و كان الكلاس C هو الأب و الكلاس B هو الإبن للكلاس A و الكلاس C يعتبر إبن للكلاس B و يعتبر حفيد للكلاس A يعني جده هو A و هنا سيكون سؤالنا هو هل يستطيع الكلاس C أن يصل لمتغيرات و دوال جده الكلاس A أم لا.

 

مثال 5

package C;
class A
{
    int x= 10;
    void print()
    {
        System.out.println(x);
    }
}
class B extends A
{
  
}

public class C extends B {

     public static void main(String []args){
         C ob=new C();
         ob.x=20;
         ob.print();
     }


شرح المثال السابق 5

يحتوي البرنامج على ثلاث كلاسات و هي الكلاس A و الكلاس B و الكلاس C و كان الكلاس C هو الأب و الكلاس B هو الإبن للكلاس A و الكلاس C يعتبر إبن للكلاس B و يعتبر حفيد للكلاس A يعني جده هو A ثم دخلنا للبرنامج الرئيسي و إشتقينا كائن من الكلاس C و هو ob ثم طلبنا الوصول للمتغير x الذي في جده و أعطيناه قيمة 20 ثم إستدعينا دالة print الموجودة في الكلاس A لطباعة قيمة x و عمل هذه الدالة هو طباعة قيمة x.

من خلال المثال السابق نستنتج بأن الكلاس الحفيد يستطيع الوصول إلى كافة متغيرات و دوال الكلاس الجد ما عدا تلك الدوال و المتغيرات المحمية private لأنها هي خاصة بالكلاس.

google-playkhamsatmostaqltradent