Java yra į objektą orientuota programavimo kalba, leidžianti kūrėjams kurti sudėtingas programinės įrangos sistemas. Viena iš pagrindinių Java savybių yra paveldėjimas, leidžiantis klasėms paveldėti savybes ir metodus iš kitų klasių. „Java“ klasėje vienu metu galima išplėsti tik vieną pirminę klasę, tačiau naudojant sąsajas galima pasiekti kelis paveldėjimo būdus. Šiame straipsnyje mes išnagrinėsime, kaip išplėsti kelias Java klases ir pateikti pavyzdines programas su išvestimi.
Kelių „Java“ klasių išplėtimas
„Java“ neleidžia klasei tiesiogiai išplėsti kelių klasių. To priežastis yra vengti deimantų problemos, kuri atsiranda, kai klasė paveldi iš dviejų klasių, turinčių bendrą superklasę. Siekiant išvengti šios problemos, „Java“ leidžia klasei įdiegti kelias sąsajas, kurios gali pasiekti panašias funkcijas.
Sąsaja yra abstrakčių metodų rinkinys, apibrėžiantis klasės elgesį. Skirtingai nuo klasių, sąsajos negali būti kartojamos, tačiau jas gali įgyvendinti klasės. Įdiegus sąsają, klasė gali paveldėti savybes ir metodus iš kelių sąsajų. Tai leidžia klasei pasiekti daugkartinį į paveldėjimą panašų elgesį be deimantų problemos. Norėdami išplėsti kelias Java klases, turime sukurti sąsają, kurioje būtų pirminių klasių savybės ir metodai. Įdiegimo klasė gali įdiegti sąsają ir paveldėti pirminių klasių savybes ir metodus. Pažvelkime į pavyzdį, kad geriau suprastume šią sąvoką.
sdlc gyvavimo ciklas
Kelių „Java“ klasių išplėtimas
Šiame pavyzdyje sukursime tris klases: Gyvūnai, Žinduoliai ir Ropliai. Tada sukursime sąsają pavadinimu Omnivore, kuri išplės gyvūnų ir žinduolių klases. Galiausiai sukursime klasę Platypus, kuri įdiegs Omnivore sąsają.
Gyvūnų klasėje bus metodas, vadinamas „valgyk“, kuris spausdina „Gyvūnas valgo“. „Mammal“ klasė išplės „Animal“ klasę ir apima metodą, vadinamą „drinkMilk“, kuris išspausdina „Mammal is drinking milk“. Roplių klasė taip pat išplės gyvūnų klasę ir apima metodą, vadinamą „dėti kiaušinius“, kuris spausdina „Ropliai deda kiaušinius“.
Čia yra gyvūnų klasės kodas:
public class Animal { public void eat() { System.out.println('Animal is eating.'); } }
Štai žinduolių klasės kodas:
sujungti rūšiuoti java
public class Mammal extends Animal { public void drinkMilk() { System.out.println('Mammal is drinking milk.'); } }
Čia yra roplių klasės kodas:
public class Reptile extends Animal { public void layEggs() { System.out.println('Reptile is laying eggs.'); } }
Dabar sukurkime „Omnivore“ sąsają, kuri išplės gyvūnų ir žinduolių klases:
public interface Omnivore extends Animal, Mammal { public void eatPlants(); }
Galiausiai sukurkime Platypus klasę, kuri įdiegs Omnivore sąsają:
public class Platypus implements Omnivore { public void eat() { System.out.println('Platypus is eating.'); } public void drinkMilk() { System.out.println('Platypus is drinking milk.'); } public void eatPlants() { System.out.println('Platypus is eating plants.'); } }
Šiame pavyzdyje Platypus klasė įgyvendina Omnivore sąsają, kuri išplečia gyvūnų ir žinduolių klases. Todėl Platypus klasė paveldi tiek gyvūnų, tiek žinduolių klasių savybes ir metodus.
Išbandykime savo programą sukurdami Platypus klasės egzempliorių ir iškviesdami jo metodus:
public class Main { public static void main(String[] args) { Platypus p = new Platypus(); p.eat(); p.drinkMilk(); p.eatPlants(); } }
Išvestis:
Platypus is eating. Platypus is drinking milk. Platypus is eating plants.
Kaip matome, Platypus klasė gali paveldėti tiek gyvūnų, tiek žinduolių klasių savybes ir metodus, įdiegdama Omnivore sąsają. Tai leidžia mums pasiekti daugybę į paveldėjimą panašų elgesį Java.
Kada naudoti daugialypį paveldėjimą panašų elgesį „Java“.
Nors naudojant sąsajas galima pasiekti daugybę į paveldėjimą panašų elgesį „Java“, tai ne visada būtina ar pageidautina. Tiesą sakant, daugelis kūrėjų teigia, kad dėl daugybinio paveldėjimo kodas gali būti sudėtingesnis ir jį sunku prižiūrėti. Todėl svarbu atidžiai apsvarstyti, ar jūsų programai reikia daugkartinio paveldėjimo elgesio.
paslėptos programos
Viena situacija, kai gali būti naudingas keli į paveldėjimą panašūs veiksmai, kai reikia derinti kelių šaltinių funkcijas. Pavyzdžiui, jei turite dvi klases, kurios teikia skirtingų tipų funkcijas, galbūt norėsite jas sujungti į vieną klasę, kuri paveldima iš abiejų. Šiuo atveju geras sprendimas gali būti sąsajos, kuri išplečia abi klases, įdiegimas. Kita situacija, kai gali būti naudingas daugialypis į paveldėjimą panašus elgesys, kai dirbate su trečiųjų šalių bibliotekomis, kurios plačiai naudoja paveldėjimą. Jei reikia išplėsti kelias trečiųjų šalių klases, sąsajų diegimas gali būti geras būdas tai pasiekti nesukuriant sudėtingų paveldėjimo hierarchijų.
„Java“ neįmanoma tiesiogiai išplėsti kelių klasių. Tačiau galima pasiekti daugybę į paveldėjimą panašų elgesį, įdiegus sąsajas, kurios išplečia kelias klases. Tai leidžia klasei paveldėti ypatybes ir metodus iš kelių pirminių klasių be deimantinės problemos, kuri gali kilti dėl tiesioginio daugybinio paveldėjimo. Nors tam tikrose situacijose gali būti naudingas daugialypis į paveldėjimą panašus elgesys, svarbu atidžiai apsvarstyti, ar tai būtina jūsų programai. Daugeliu atvejų sąsajų ir kompozicijos naudojimas gali būti geresnis sprendimas derinant kelių šaltinių funkcijas.