שימוש בגמר מילות המפתח עם ירושה ב- Java

ואילו אחד של ג'אווה חוזקות היא מושג הירושה, שבו אחת מעמד יכול לנבוע מאחר, לפעמים רצוי למנוע ירושה על ידי מעמד אחר. כדי למנוע ירושה, השתמש במילת המפתח "סופי" בעת יצירת הכיתה.

לדוגמה, אם סביר להניח שישתמש בכיתה על ידי מתכנתים אחרים, ייתכן שתרצה למנוע ירושה אם תת-סוגות שנוצרו עלולות לגרום לבעיות. דוגמא טיפוסית היא שיעור מיתרים. אם היינו רוצים ליצור תת מחרוזת:

MyString בכיתה ציבורית מרחיב את מחרוזת {
}

אנו עומדים בפני שגיאה זו:

 לא יכול לרשת מ- java.lang הסופי. מחרוזת 

מעצבי שכבת המיתרים הבינו כי אינו מועמד לירושה ומנעו את הרחבתה.

מדוע למנוע ירושה?

הסיבה העיקרית למנוע ירושה היא לוודא שהדרך בה מתנהגת כיתה לא נפגמת על ידי תת-קבוצה.

נניח שיש לנו חשבון מחלקה ותת משנה שמרחיבה אותו, OverdraftAccount. לחשבון מחלקה יש שיטה getBalance ():

 איזון כפול ציבורי ()

{

 להחזיר את זה. איזון;

 } 

בשלב זה בדיוננו, OverdraftAccount משנה לא דרס שיטה זו.

(הערה: לדיון נוסף שמשתמש בכיתות זה וחשבון משיכת חשבונות, ראה כיצד א ניתן להתייחס לתת-משנה כאל סוג-על).

בואו ניצור מופע לכל אחד משיעורי החשבון וההפקדה בחשבון.

 חשבון bobsAccount = חשבון חדש (10);
instagram viewer

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = חשבון OverdraftAccount חדש (15.05,500,0.05);

 jimsAccount.depositMoney (50);

 // ליצור מערך של אובייקטים בחשבון

 // אנו יכולים לכלול ג'ימס-חשבון מכיוון שאנחנו 

 // רק רוצה להתייחס אליו כאל אובייקט חשבון

 חשבון [] חשבונות = {bobsAccount, jimsAccount};


 // עבור כל חשבון במערך, הצג את היתרה

 עבור (חשבון א: חשבונות)

 {

 System.out.printf ("היתרה היא% .2f% n", a.getBalance ());

 }

 הפלט הוא:

 היתרה היא 60.00

 היתרה היא 65.05 

נראה שהכל עובד כצפוי, כאן. אבל מה אם OverdraftAccount מבטל את השיטה getBalance ()? אין שום דבר שמונע ממנו לעשות דבר כזה:

 חשבון משיכה מחלקה ציבורית מרחיב את החשבון {


 משיכה יתר כפולה פרטית

 דמי משיכה כפולים פרטיים;


 // שאר הגדרת הכיתה אינה כלולה


 איזון כפול ציבורי ()

 {

 החזר 25.00;

 }

 } 

אם קוד הדוגמה שלמעלה מבוצע שוב, הפלט יהיה שונה מכיוון שהתנהגות thegetBalance () בכיתה OverdraftAccount נקראת jimsAccount:

 הפלט הוא:

 היתרה היא 60.00

 היתרה היא 25.00 

למרבה הצער, תת-החשבון OverdraftAccount יקיים לעולם לא לספק את היתרה הנכונה מכיוון שהרסנו את התנהגות מחלקת החשבון דרך ירושה.

אם אתה מעצב כיתה שתשתמש בתכנתים אחרים, שקול תמיד את ההשלכות של כל תת-קבוצות אפשריות. זו הסיבה שאי אפשר להאריך את מעמד המיתרים. חשוב מאוד שמתכנתים ידעו שכאשר הם יוצרים אובייקט מחרוזת, זה תמיד יתנהג כמו מחרוזת.

כיצד למנוע את הירושה

כדי למנוע את הרחבת הכיתה, על הצהרת הכיתות לומר במפורש שהיא לא יכולה לעבור בירושה. זה מושג באמצעות מילת המפתח "הסופי":

 חשבון מחזור גמר ציבורי {


 } 

המשמעות היא שכיתת החשבון אינה יכולה להיות סוג-על, וכיתת OverdraftAccount כבר לא יכולה להיות תת-המשנה שלה.

לפעמים, תרצה להגביל רק התנהגויות מסוימות של סוג-על כדי להימנע משחיתות של תת-סוג. לדוגמה, OverdraftAccount עדיין יכול להיות תת-משנה של חשבון, אך יש למנוע ממנו לדרוס את שיטת getBalance ().

במקרה זה, השתמש במילת המפתח "הסופית" בהצהרת השיטה:

 חשבון בכיתה ציבורית {


 איזון כפול פרטי;


 // שאר הגדרת הכיתה אינה כלולה


 קבלת איזון כפול גמר ציבורי אחרון)

 {

 להחזיר את זה. איזון;

 } 

 } 

שימו לב כיצד לא משתמשים במילת המפתח הסופית בהגדרת הכיתה. ניתן ליצור קבוצות משנה של חשבון, אך אינן יכולות עוד לעקוף את שיטת getBalance (). כל קוד שקורא לשיטה זו יכול להיות בטוח בכך שהיא תעבוד כמו שהתכנת המקורי התכוון.