Atslēgvārdu fināla izmantošana ar mantojumu Java

Kaut arī viens no Java stiprās puses ir mantojuma jēdziens, kurā viens klase var rasties no citas, dažreiz ir vēlams novērst mantošanu no citas klases. Lai novērstu mantošanu, klases veidošanā izmantojiet atslēgvārdu "galīgais".

Piemēram, ja klasi, visticamāk, izmantos citi programmētāji, jūs varētu vēlēties novērst mantošanu, ja izveidotās apakšklases varētu radīt problēmas. Tipisks piemērs ir Stīgu klase. Ja mēs vēlamies izveidot Stīgu apakšklasi:

sabiedriskās klases MyString paplašina stīgu {
}

Mums būtu jāsaskaras ar šo kļūdu:

 nevar mantot no pēdējās java.lang. Stīgu 

Stīgu klases dizaineri saprata, ka tas nav mantojuma kandidāts, un ir novērsuši iespēju to pagarināt.

Kāpēc jānovērš mantojums?

Galvenais iemesls, lai novērstu mantojums ir pārliecināties, ka klases uzvedība nav bojāta apakšklasē.

Pieņemsim, ka mums ir klases konts un apakšklase, kas to paplašina, OverdraftAccount. Klases kontam ir metode getBalance ():

 publisks dubults getBalance ()

{

 atgriezt šo līdzsvaru;

 } 

Šajā diskusijas brīdī apakšklase OverdraftAccount nav ignorējusi šo metodi.

instagram viewer

(Piezīme: Citai diskusijai, izmantojot šo kontu un OverdraftAccount klases, skatiet, kā a apakšklasi var uzskatīt par superklases).

Izveidosim eksemplāru katrā no konta un overdraftAccount klasēm:

 Konts bobsAccount = jauns konts (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = jauns OverdraftAccount (15.05.500.0.05);

 jimsAccount.depositMoney (50);

 // izveidojiet konta objektu masīvu

 // mēs varam iekļaut jimsAccount, jo mēs 

 // vēlas to uzskatīt tikai par konta objektu

 Konta [] konti = {bobsAccount, jimsAccount};


 // katram masīva kontam parādiet atlikumu

 par (konts a: konti)

 {

 System.out.printf ("Bilance ir% .2f% n", a.getBalance ());

 }

 Rezultāts ir:

 Bilance ir 60.00

 Bilance ir 65.05 

Šķiet, ka šeit viss darbojas kā paredzēts. Bet ko darīt, ja OverdraftAccount ignorē metodi getBalance ()? Nekas neliedz tam rīkoties šādi:

 sabiedriskās klases OverdraftAccount paplašina kontu {


 privāts dubultā overdraftsLimit;

 privāts divkāršs overdraftsFee;


 // pārējā klases definīcija nav iekļauta


 publisks dubults getBalance ()

 {

 atgriešanās 25.00;

 }

 } 

Ja iepriekš minētais koda piemērs tiek izpildīts vēlreiz, izvade būs atšķirīga, jo thegetBalance () izturēšanās OverdraftAccount klasē tiek pieprasīta jimsAccount:

 Rezultāts ir:

 Bilance ir 60.00

 Bilance ir 25.00 

Diemžēl apakšklase OverdraftAccount būs nekad nodrošināt pareizu atlikumu, jo mantojuma dēļ mēs esam sabojājuši kontu klases rīcību.

Ja jūs projektējat klasi, kuru izmantos citi programmētāji, vienmēr apsveriet potenciālo apakšklases ietekmi. Tas ir iemesls, kāpēc Stīgu klasi nevar pagarināt. Ir ārkārtīgi svarīgi, lai programmētāji zinātu, ka, veidojot stīgu objektu, tas vienmēr izturēsies kā stīgas.

Kā novērst mantojumu

Lai pārtrauktu klases pagarināšanu, klases deklarācijā skaidri jānorāda, ka to nevar mantot. Tas tiek panākts, izmantojot "galīgo" atslēgvārdu:

 publiskais noslēguma klases konts {


 } 

Tas nozīmē, ka konta klase nevar būt virsklases, un klase OverdraftAccount vairs nevar būt tās apakšklase.

Dažreiz, iespējams, vēlēsities ierobežot tikai noteiktas superklases izturēšanos, lai izvairītos no korupcijas ar apakšklases palīdzību. Piemēram, OverdraftAccount joprojām var būt Konta apakšklase, taču tas nedrīkstētu būt svarīgāks par getBalance () metodi.

Šajā gadījumā metodes deklarācijā izmantojiet "galīgo" atslēgvārdu:

 sabiedriskās klases konts {


 privāta dubultā bilance;


 // pārējā klases definīcija nav iekļauta


 publisks fināla dubultā getBalance ()

 {

 atgriezt šo līdzsvaru;

 } 

 } 

Ievērojiet, kā klases definīcijā netiek izmantots pēdējais atslēgvārds. Var izveidot konta apakšklases, taču tās vairs nevar ignorēt metodi getBalance (). Jebkurš kods, kas izsauc šo metodi, var būt pārliecināts, ka tas darbosies tā, kā paredzēts sākotnējais programmētājs.