معلومات

كيفية منع الوراثة في جافا باستخدام الكلمات الرئيسية النهائية

كيفية منع الوراثة في جافا باستخدام الكلمات الرئيسية النهائية

في حين أن إحدى نقاط قوة Java هي مفهوم الميراث ، والذي يمكن أن تستمد فيه فئة ما من فئة أخرى ، فمن المستحسن في بعض الأحيان منع الميراث من فئة أخرى. لمنع الوراثة ، استخدم الكلمة الأساسية "final" عند إنشاء الفصل.

على سبيل المثال ، إذا كان من المحتمل استخدام فئة من قبل المبرمجين الآخرين ، فقد ترغب في منع الميراث إذا تسببت أي فئات فرعية تم إنشاؤها في حدوث مشكلات. مثال نموذجي هو فئة السلسلة. إذا أردنا إنشاء فئة فرعية من السلسلة:

الطبقة العامة MyString تمتد سلسلة {
}

سنواجه هذا الخطأ:

لا يمكن أن يرث من java.lang.String النهائي

أدرك مصممو الفئة String أنه لم يكن مرشح للميراث ومنعت من تمديده.

لماذا منع الميراث؟

السبب الرئيسي لمنع الميراث هو التأكد من أن سلوك الفئة لا يتلف بواسطة فئة فرعية.

افترض أن لدينا حسابًا للفئة وفئة فرعية تمدها ، OverdraftAccount. يحتوي حساب الفئة على طريقة getBalance ():

getBalance العامة مزدوجة ()

{

إرجاع هذا.

}

في هذه المرحلة من مناقشتنا ، لم تتجاوز الفئة الفرعية OverdraftAccount هذه الطريقة.

(ملحوظة: لمناقشات أخرى باستخدام فصول الحساب والحساب OverdraftAccount هذه ، راجع كيف يمكن التعامل مع فئة فرعية كفئة فائقة).

لنقم بإنشاء مثيل لكل من فئتي الحساب و OverdraftAccount:

حساب bobsAccount = حساب جديد (10) ؛

bobsAccount.depositMoney (50)؛

OverdraftAccount jimsAccount = جديد OverdraftAccount (15.05،500،0.05)؛

jimsAccount.depositMoney (50)؛

/ / قم بإنشاء مجموعة من كائنات الحساب

/ / يمكننا تضمين jimsAccount لأننا

/ / يريدون فقط معاملته ككائن حساب

حسابات الحساب = {bobsAccount، jimsAccount}؛

// لكل حساب في المصفوفة ، اعرض الرصيد

لـ (الحساب أ: الحسابات)

{

System.out.printf ("الرصيد هو٪ .2f٪ n"، a.getBalance ())؛

}

الإخراج هو:

الرصيد هو 60.00

الرصيد هو 65.05

كل شيء يبدو للعمل كما هو متوقع ، هنا. ولكن ماذا لو تجاوز OverdraftAccount الأسلوب getBalance ()؟ لا يوجد شيء لمنعه من القيام بشيء مثل هذا:

الطبقة العامة OverdraftAccount يمتد الحساب {

السحب على المكشوف الخاص المزدوج.

السحب على المكشوف الخاص المزدوج.

// لا يتم تضمين بقية تعريف الفئة

getBalance العامة مزدوجة ()

{

عودة 25.00 ؛

}

}

إذا تم تنفيذ رمز المثال أعلاه مرة أخرى ، فسيكون الإخراج مختلفًا لأن سلوك getBalance () في فئة OverdraftAccount يسمى jimsAccount:

الإخراج هو:

الرصيد هو 60.00

الرصيد هو 25.00

لسوء الحظ ، فإن الفئة الفرعية OverdraftAccount سوف أبدا توفير الرصيد الصحيح لأننا أفسدنا سلوك فئة الحساب من خلال الميراث.

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

كيفية منع الميراث

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

حساب الدرجة النهائية العامة

}

هذا يعني أن فئة الحساب لا يمكن أن تكون فئة فائقة ، وأن فئة OverdraftAccount لم تعد فئة فرعية.

في بعض الأحيان ، قد ترغب في الحد من سلوكيات معينة فقط من الفئة الفائقة لتجنب الفساد بواسطة فئة فرعية. على سبيل المثال ، قد لا يزال OverdraftAccount فئة فرعية من الحساب ، ولكن يجب منعه من تجاوز أسلوب getBalance ().

في هذه الحالة ، استخدم الكلمة الأساسية "النهائية" في تعريف الطريقة:

حساب فئة عامة

توازن مزدوج خاص ؛

// لا يتم تضمين بقية تعريف الفئة

getBalance النهائي المزدوج العام ()

{

إرجاع هذا.

}

}

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


شاهد الفيديو: تعالوا شوفوا الوصف دي بتعمل ايه لشعروصفه فظيعه (شهر نوفمبر 2021).