Märksõna finaali kasutamine pärimisel Java-s

Kuigi üks neist Java tugevused on pärandi mõiste, milles üks klass võib tuleneda teisest, mõnikord on soovitav takistada teise klassi pärimist. Pärimise vältimiseks kasutage klassi loomisel märksõna "lõplik".

Näiteks kui klassi kasutavad tõenäoliselt teised programmeerijad, võiksite pärandi vältimist, kui mõni loodud alamklass võib probleeme põhjustada. Tüüpiline näide on Keelpilliklass. Kui me tahaksime luua Stringi alaklassi:

avaliku klassi MyString laiendab keelt {
}

Meie ees oleks see tõrge:

 ei saa lõplikust java.lang pärida. Keel 

Keeluklassi disainerid mõistsid, et see ei olnud pärandikandidaat, ja on takistanud selle pikendamist.

Miks pärandit vältida?

Peamine põhjus ennetamiseks pärimine on veenduda, et klassi käitumisviis ei ole alamklassi rikutud.

Oletame, et meil on klassi konto ja seda laiendav alaklass, OverdraftAccount. Klassikontol on meetod getBalance ():

 avalik topeltbilanss ()

{

 tagasta see tasakaal.

 } 

Meie arutelu sellel hetkel ei ole alaklass OverdraftAccount seda meetodit ületanud.

instagram viewer

(Märge: Veel ühe selle konto ja OverdraftAccount klassi kasutamist käsitleva arutelu jaoks lugege kuidas alaklassi võib käsitleda superklassina).

Loome iga konto ja arvelduskrediidi klassi eksemplari:

 Konto bobsAccount = uus konto (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = uus OverdraftAccount (15.05.500,0.05);

 jimsAccount.depositMoney (50);

 // loo kontoobjektide massiiv

 // võime lisada jimsAccount, kuna meie 

 // tahan käsitleda seda ainult kontoobjektina

 Konto [] kontod = {bobsAccount, jimsAccount};


 // kuvage massiivi iga konto saldo

 jaoks (konto a: kontod)

 {

 System.out.printf ("Saldo on% .2f% n", a.getBalance ());

 }

 Väljund on:

 Saldo on 60.00

 Saldo on 65.05 

Kõik näib toimivat ootuspäraselt, siin. Mis saab siis, kui OverdraftAccount alistab meetodi getBalance ()? Miski ei takista tal midagi sellist tegemast:

 avaliku klassi arvelduslaen laiendab kontot {


 topelt arvelduskrediitLimit;

 privaatne topeltkrediitFee;


 // ülejäänud klassi määratlus ei sisaldu


 avalik topeltbilanss ()

 {

 tagasi 25.00;

 }

 } 

Kui ülaltoodud näitekood käivitatakse uuesti, on väljund erinev, kuna klassis OverdraftAccount on thegetBalance () käitumine jimsAccount:

 Väljund on:

 Saldo on 60.00

 Saldo on 25.00 

Alamklass OverdraftAccount kahjuks saab mitte kunagi esitage õige saldo, kuna oleme pärandi kaudu kontoklassi käitumist rikkunud.

Kui kujundate klassi, mida kasutada teiste programmeerijate jaoks, kaaluge alati võimalike alaklasside mõjusid. See on põhjus, miks keelpilliklassi pikendada ei saa. On äärmiselt oluline, et programmeerijad teaksid, et kui nad loovad stringi, käitub see alati nagu string.

Kuidas pärandit vältida

Klassi pikendamise peatamiseks peab klassideklaratsioon sõnaselgelt ütlema, et seda ei saa pärida. See saavutatakse märksõna "lõplik" abil:

 avaliku lõpuklassi konto {


 } 

See tähendab, et konto klass ei saa olla ülemklass ja OverdraftAccount klass ei saa enam olla selle alaklass.

Mõnikord võiksite alamklassi korruptsiooni vältimiseks piirata ainult teatud klassi ülemklassi käitumist. Näiteks OverdraftAccount võib ikkagi olla konto alamklass, kuid tuleks takistada getBalance () meetodi alistamist.

Sel juhul kasutage meetodi deklaratsioonis märksõna "lõplik":

 avaliku klassi konto {


 privaatne kahekordne tasakaal;


 // ülejäänud klassi määratlus ei sisaldu


 avalik lõplik topeltbilanss ()

 {

 tagasta see tasakaal.

 } 

 } 

Pange tähele, kuidas klassi määratluses lõplikku märksõna ei kasutata. Konto alamklasse saab luua, kuid need ei saa enam getBalance () meetodit alistada. Iga kood, mis seda meetodit kutsub, võib olla kindel, et see töötab nii, nagu algne programmeerija ette nägi.

instagram story viewer