Java je objektno usmerjen programski jezik, ki razvijalcem omogoča ustvarjanje kompleksnih programskih sistemov. Ena od ključnih značilnosti Jave je dedovanje, ki omogoča razredom, da podedujejo lastnosti in metode od drugih razredov. V Javi lahko razred hkrati razširi samo en nadrejeni razred, vendar je mogoče z uporabo vmesnikov doseči vedenje, podobno večkratnemu dedovanju. V tem članku bomo raziskali, kako razširiti več razredov v Javi, in ponudili primere programov z izhodom.
Razširitev več razredov v Javi
Java ne dovoljuje, da razred neposredno razširi več razredov. Razlog za to je, da se izognemo diamantnemu problemu, ki se pojavi, ko razred podeduje dva razreda, ki imata skupni nadrazred. Da bi se izognili tej težavi, Java omogoča razredu implementacijo več vmesnikov, ki lahko dosežejo podobno funkcionalnost.
Vmesnik je zbirka abstraktnih metod, ki definirajo vedenje razreda. Za razliko od razredov vmesnikov ni mogoče instancirati, lahko pa jih implementirajo razredi. Z implementacijo vmesnika lahko razred podeduje lastnosti in metode iz več vmesnikov. Omogoča razredu, da doseže vedenje, podobno večkratnemu dedovanju, brez diamantnega problema. Za razširitev več razredov v Javi moramo ustvariti vmesnik, ki vsebuje lastnosti in metode nadrejenih razredov. Izvedbeni razred lahko nato implementira vmesnik in podeduje lastnosti in metode nadrejenih razredov. Oglejmo si primer, da bomo bolje razumeli ta koncept.
kaj je regex java
Razširitev več razredov v Javi
V tem primeru bomo ustvarili tri razrede: žival, sesalec in plazilec. Nato bomo ustvarili vmesnik z imenom Omnivore, ki bo razširil razreda Animal in Mammal. Končno bomo ustvarili razred z imenom Platypus, ki bo implementiral vmesnik Omnivore.
Razred Animal bo vseboval metodo, imenovano 'eat', ki natisne 'Animal is eating.' Razred Mammal bo razširil razred Animal in vseboval metodo, imenovano 'drinkMilk', ki natisne 'Sesalec pije mleko.' Razred Reptile bo prav tako razširil razred Animal in vseboval metodo, imenovano 'layEggs', ki natisne 'Reptile is laying eggs.'
Tukaj je koda za razred živali:
public class Animal { public void eat() { System.out.println('Animal is eating.'); } }
Tukaj je koda za razred Sesalec:
public class Mammal extends Animal { public void drinkMilk() { System.out.println('Mammal is drinking milk.'); } }
Tukaj je koda za razred Reptile:
f filmi
public class Reptile extends Animal { public void layEggs() { System.out.println('Reptile is laying eggs.'); } }
Zdaj pa ustvarimo vmesnik Omnivore, ki bo razširil razreda živali in sesalcev:
public interface Omnivore extends Animal, Mammal { public void eatPlants(); }
Končno ustvarimo razred Platypus, ki bo implementiral vmesnik Omnivore:
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.'); } }
V tem primeru razred Platypus implementira vmesnik Omnivore, ki razširja razreda Animal in Mammal. Zato razred Platypus podeduje lastnosti in metode razredov Animal in Mammal.
Preizkusimo naš program tako, da ustvarimo primerek razreda Platypus in pokličemo njegove metode:
poskusi catch catch java
public class Main { public static void main(String[] args) { Platypus p = new Platypus(); p.eat(); p.drinkMilk(); p.eatPlants(); } }
Izhod:
Platypus is eating. Platypus is drinking milk. Platypus is eating plants.
Kot lahko vidimo, lahko razred Platypus podeduje lastnosti in metode obeh razredov Animal in Mammal z implementacijo vmesnika Omnivore. To nam omogoča, da v Javi dosežemo vedenje, podobno večkratnemu dedovanju.
Kdaj v Javi uporabiti vedenje, podobno večkratnemu dedovanju
Medtem ko je z uporabo vmesnikov v Javi mogoče doseči vedenje, podobno večkratnemu dedovanju, ni vedno potrebno ali zaželeno. Pravzaprav mnogi razvijalci trdijo, da lahko večkratno dedovanje naredi kodo bolj zapleteno in jo je težko vzdrževati. Zato je pomembno skrbno razmisliti, ali je za vaš program potrebno vedenje, podobno večkratnemu dedovanju.
Ena od situacij, kjer je lahko koristno vedenje, podobno večkratnemu dedovanju, je, ko morate združiti funkcionalnost iz več virov. Na primer, če imate dva razreda, ki nudita različne vrste funkcionalnosti, ju boste morda želeli združiti v en sam razred, ki deduje od obeh. V tem primeru je lahko implementacija vmesnika, ki razširja oba razreda, dobra rešitev. Druga situacija, kjer je lahko koristno vedenje, podobno večkratnemu dedovanju, je, ko delate s knjižnicami tretjih oseb, ki obsežno uporabljajo dedovanje. Če morate razširiti več razredov tretjih oseb, je implementacija vmesnikov lahko dober način, da to dosežete brez ustvarjanja zapletenih hierarhij dedovanja.
V Javi ni mogoče neposredno razširiti več razredov. Vendar pa je mogoče doseči vedenje, podobno večkratnemu dedovanju, z implementacijo vmesnikov, ki razširjajo več razredov. To omogoča razredu, da podeduje lastnosti in metode iz več nadrejenih razredov, brez diamantne težave, ki lahko nastane pri neposrednem večkratnem dedovanju. Medtem ko je vedenje, podobno večkratnemu dedovanju, lahko uporabno v določenih situacijah, je pomembno skrbno razmisliti, ali je to potrebno za vaš program. V mnogih primerih je lahko uporaba vmesnikov in sestave boljša rešitev za združevanje funkcionalnosti iz več virov.