fbpx

تعلم لغة الجافا – الدرس التاسع الوراثة Inheritance



في Java ، يشير مصطلح الوراثة إلى اعتماد جميع الخصائص والأساليب غير الخاصة للكلاس واحدة (superclass) من كلاس أخرى (subclass).

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

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

بالإضافة إلى ذلك ، يستخدم الوراثة (بشكل أكثر دقة ، تعريف كلاس فرعية) الكلمة الأساسية extends في تعريف الكلاس الفرعية.

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

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

يمكن استخدام أساليب وخصائص كلاس فرعية تمامًا مثل تلك الموجودة في الكلاس الفائقة. يمكن أيضًا تجاوزها.

التجاوز هو عملية استبدال (أو زيادة) الكود الأصلي بكود جديد يتناسب مع الغرض الحالي. يظل توقيع الطريقة التي تم تجاوزها في الكلاس الفرعية كما هو الحال مع الكلاس الفائقة ولكن سيتم تغيير محتويات الطريقة لتحقيق هدف الطريقة في شكلها الجديد.

قد يعني هذا تنفيذ التعليمات البرمجية الموروثة من الكلاس الفائقة قبل أو بعد تنفيذ بعض التعليمات البرمجية الجديدة في نفس الطريقة. لتنفيذ التعليمات البرمجية الموروثة من داخل الكلاس الفرعية ، بادئة الأسلوب باستخدام super.

من الممكن أيضًا كتابة مُنشئ كلاس فرعية تستدعي مُنشئ الكلاس الفائقة ، إما بشكل ضمني أو باستخدام الكلمة الأساسيةsuper (على سبيل المثال ، super.methodName () ).

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

يمكن بعد ذلك إنشاء الكلاس الفرعية من الكلاس الفائقة بغرض أدق وأكثر تحديدًا

مثال على الوراثة

فكر في باب. لا يهم أي نوع. جميع الأبواب تفتح وتغلق. ومع ذلك ، تفتح بعض الأبواب بشكل مختلف عن غيرها (الرفع مقابل التأرجح للخارج ، والتأرجح مقابل الانزلاق عبر). لذا ، لنفترض أن الباب هو الطبقة الفائقة للباب ولديه طريقة open مفتوحة.

الطريقة بسيطة. الأمر الوحيد هو دفع.. الطريقة بسيطة. الأمر الوحيد هو push.

public class Door {
    public void open ()
    {
        push();     // نظرًا لأن هذا مجرد "باب" عام ، فسوف نفترض أبسط طريقة فتح.

// يجب إلغاء الطريقة المفتوحة الفعلية بواسطة كلاس  فرعية ، كما نرى أدناه.
// لاحقًا ، سيتم عرض طريقة لإجبار كلاس  فرعية على تجاوز طريقة -ذ
// ولكن لهذا المثال البسيط سيفعله الآن.
    }
}

قد يكون استخدام هذه الكلاس على باب خزانة البنك غير ناجح. تتمثل الإستراتيجية الأفضل في “باب الكلاس الفرعية” باستخدام الوراثة ثم تجاوز الطريقة open لإدخال المجموعة وpull بدلاً من push.

class BankVaultDoor extends Door {        // تستخدم الكلمة الرئيسية "الممتدة" لإخبار جافا بأن BankVaultDoor يرث وظائف Door.

    public void open () {
        enterCombination();
        pull;
    }

}

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

public class Main {

    public static void main(String[] args) {
        Door d1 = new BankVaultDoor();
        Door d2 = new HouseFrontDoor();
        Door d3 = new CarDoor();
    }

    if (arg[0] == "car") {
        d3.open();
    } else if (arg[0] == "bank") {
        d1.open();
    } else {
        d2.open();
    }
}

لاحظ أن الطريقة open() لا تعرف (أو تهتم) بنوع الباب. ستستخدم أي كلاس تم تصنيفها فرعيًا من Door ( باستخدام Extended Door ) طريقة open () لفتحها.

تمرين

قم بإنشاء كلاس باب أمامي للمنزل ترثها كلاس باب وافتحها. افترض أن باب المنزل مزود بباب مقفل ويتأرجح إلى المنزل. تلميح: يجب أن يستخدم الكود الخاص بك الكلمة الأساسية الفائقة.

    public class Door {
        public void open ()
        {
            push();
        }
    }

    class BankVaultDoor extends Door {
  
        public void open () {
            enterCombination();
            pull;
        }
  
    }

    class HouseFrontDoor extends Door {
// رمزك هنا
    }

الحل

    public class Door {
        public void open ()
        {
            push();
        }
    }

    class BankVaultDoor extends Door {
  
        public void open () {
            enterCombination();
            pull;
        }
  
    }

    class HouseFrontDoor extends Door {

        public void open () {
            insertKeyAndTurnKnob();
            super.push();
        }

    }

سنحصل على النتيجة التالية عند التشغيل

Main.java:12: error: not a statement
            pull;
            ^
1 error

الدرس العاشر






Leave a Reply