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

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

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

الفئة العامة MyString تمدد String {
}

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

 لا يمكن أن ترث من java.lang النهائي. خيط 

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

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

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

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

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

{

 إعادة هذا التوازن.

 } 

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

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

instagram viewer

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

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

 bobsAccount.depositMoney (50) ؛

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

 jimsAccount.depositMoney (50) ؛

 // إنشاء صفيف من كائنات الحساب

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

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

 Account [] accounts = {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 (). أي رمز يستدعي هذه الطريقة يمكن أن يكون واثقًا من أنه سيعمل كما هو مبرمج أصلي.