Χρησιμοποιώντας τον Τελικό Λέξη-κλειδί με κληρονομικότητα στην Java

click fraud protection

Ενώ ένα από Java της τα πλεονεκτήματα είναι η έννοια της κληρονομιάς, στην οποία ένα τάξη μπορεί να προέρχεται από άλλο, μερικές φορές είναι επιθυμητό να αποφευχθεί η κληρονομιά από άλλη τάξη. Για να αποτρέψετε την κληρονομιά, χρησιμοποιήστε τη λέξη-κλειδί "τελικό" κατά τη δημιουργία της κλάσης.

Για παράδειγμα, αν μια τάξη είναι πιθανό να χρησιμοποιηθεί από άλλους προγραμματιστές, ίσως θελήσετε να αποφύγετε την κληρονομία εάν οι υποκλάσεις που δημιουργήθηκαν θα μπορούσαν να προκαλέσουν προβλήματα. Ένα τυπικό παράδειγμα είναι το Κατηγορία τάξεων. Αν θέλαμε να δημιουργήσουμε μια υποκατηγορία String:

η δημόσια τάξη MyString επεκτείνει String {
}

Θα αντιμετωπίζαμε αυτό το σφάλμα:

 δεν μπορεί να κληρονομήσει από το τελικό java.lang. Σειρά 

Οι σχεδιαστές της κλάσης String συνειδητοποίησαν ότι δεν ήταν υποψήφιος για κληρονομικότητα και ότι την εμπόδισε να επεκταθεί.

Γιατί αποτρέπεται η κληρονομιά;

Ο κύριος λόγος για την πρόληψη κληρονομία είναι να βεβαιωθείτε ότι ο τρόπος συμπεριφοράς μιας κλάσης δεν είναι κατεστραμμένος από μια υποκατηγορία.

instagram viewer

Ας υποθέσουμε ότι έχουμε έναν λογαριασμό κατηγορίας και μια υποκατηγορία που το επεκτείνει, Account OverdraftAccount. Ο λογαριασμός κλάσης έχει μια μέθοδο getBalance ():

 κοινό διπλό getBalance ()

{

 επιστρέψτε αυτό το ισοζύγιο.

 } 

Σε αυτό το σημείο στη συζήτησή μας, η υποκλάση OverdraftAccount δεν έχει αντικαταστήσει αυτή τη μέθοδο.

(Σημείωση: Για μια άλλη συζήτηση που χρησιμοποιεί αυτή την κλάση λογαριασμού και OverdraftAccount, δείτε πώς a η υποκατηγορία μπορεί να αντιμετωπιστεί ως υπερκλάση).

Ας δημιουργήσουμε ένα στιγμιότυπο σε κάθε μία από τις κλάσεις Account and OverdraftAccount:

 Λογαριασμός bobsAccount = νέος λογαριασμός (10);

 bobsAccount.depositMoney (50);

 Λογαριασμός overdraft jimsAccount = νέο Λογαριασμός Overdraft (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 επεκτείνει τον λογαριασμό {


 ιδιωτικό διπλό overdraftLimit;

 ιδιωτικό διπλό overdraftFee?


 // δεν περιλαμβάνεται ο υπόλοιπος ορισμός της κλάσης


 κοινό διπλό getBalance ()

 {

 επιστροφή 25.00;

 }

 } 

Εάν εκτελείται ξανά ο παραπάνω κώδικας παραδείγματος, η έξοδος θα είναι διαφορετική επειδή η συμπεριφορά τουgetBalance () στην κλάση OverdraftAccount ονομάζεται jimsAccount:

 Η έξοδος είναι:

 Το υπόλοιπο είναι 60,00

 Το υπόλοιπο είναι 25,00 

Δυστυχώς, η υποκλάση OverdraftAccount θα είναι ποτέ να προσφέρουμε τη σωστή ισορροπία επειδή έχουμε καταστραφεί η συμπεριφορά της κλάσης λογαριασμού μέσω της κληρονομιάς.

Εάν σχεδιάζετε μια τάξη που θα χρησιμοποιηθεί από άλλους προγραμματιστές, εξετάστε πάντα τις συνέπειες τυχόν υποκλάσεων. Αυτός είναι ο λόγος για τον οποίο η κλάση String δεν μπορεί να επεκταθεί. Είναι εξαιρετικά σημαντικό οι προγραμματιστές να γνωρίζουν ότι όταν δημιουργούν ένα αντικείμενο String, πάντα θα συμπεριφέρονται σαν String.

Πώς να αποτρέψετε την κληρονομιά

Για να σταματήσει η διεύρυνση μιας κλάσης, η δήλωση κλάσης πρέπει να λέει ρητά ότι δεν μπορεί να κληρονομείται. Αυτό επιτυγχάνεται με τη χρήση της "τελικής" λέξης-κλειδιού:

 δημόσιος λογαριασμός τελικής κατηγορίας {


 } 

Αυτό σημαίνει ότι η κλάση Λογαριασμού δεν μπορεί να είναι υποκατηγορία και η κατηγορία OverdraftAccount δεν μπορεί πλέον να είναι η υποκατηγορία της.

Μερικές φορές, μπορεί να θέλετε να περιορίσετε μόνο ορισμένες συμπεριφορές μιας υπερκλάσης για να αποφύγετε τη φθορά από μια υποκατηγορία. Για παράδειγμα, το OverdraftAccount θα μπορούσε να είναι μια υποκατηγορία λογαριασμού, αλλά θα πρέπει να εμποδίζεται να παρακάμπτει τη μέθοδο getBalance ().

Σε αυτή την περίπτωση χρησιμοποιήστε την "τελική" λέξη-κλειδί στη δήλωση μεθόδου:

 λογαριασμός δημόσιας τάξης {


 ιδιωτική διπλή ισορροπία.


 // δεν περιλαμβάνεται ο υπόλοιπος ορισμός της κλάσης


 δημόσιο τελικό διπλό getBalance ()

 {

 επιστρέψτε αυτό το ισοζύγιο.

 } 

 } 

Παρατηρήστε πώς η τελική λέξη-κλειδί δεν χρησιμοποιείται στον ορισμό της κλάσης. Μπορούν να δημιουργηθούν υποκατηγορίες του λογαριασμού, αλλά δεν μπορούν πλέον να αντικαταστήσουν τη μέθοδο getBalance (). Οποιοσδήποτε κώδικας καλεί τη μέθοδο αυτή μπορεί να είναι βέβαιος ότι θα λειτουργήσει ως ο αρχικός προγραμματιστής που προορίζεται.

instagram story viewer