OOP Konsept for Nybegynnere: Hva er Arv?
Arv er en av de sentrale begrepene objekt-orientert programmering (OOP) språk. Det er en mekanisme hvor du kan for å utlede en klasse fra en annen klasse for et hierarki av klasser som deler et sett av attributter og metoder.
Du kan bruke den til å erklære forskjellige typer unntak, legge til egendefinerte logikk til eksisterende rammer, og selv kartet ditt domene modell til en database.,
Erklære en arv hierarki
I Java, hver klasse kan bare være avledet fra en annen klasse. Klassen kalles en superclass eller overordnet klasse. Avledet klasse kalles subclass, eller barnet klassen.
Du bruker søkeordet strekker seg å identifisere den klassen som din subclass strekker seg. Hvis du ikke erklære en superclass, klasse implisitt utvider klassen Object. Objektet er roten til all arv hierarkier; det er den eneste klasse i Java som ikke forlenge en annen klasse.
følgende diagram og kodebiter viser et eksempel på en enkel arv hierarki.,
klassen BasicCoffeeMachine ikke erklære en superclass og implisitt utvider klassen Object. Du kan klone CoffeeMachine eksempel prosjekt på GitHub.
klassen PremiumCoffeeMachine er en underklassen av BasicCoffeeMachine klasse.
Arv og tilgang modifikatorer
få Tilgang modifikatorer definere hvilke klasser kan få tilgang til et attributt eller en metode. I ett av mine tidligere innlegg på innkapsling, jeg viste deg hvordan du kan bruke dem til å gjennomføre et informasjons-gjemmer seg mekanisme. Men det er ikke det eneste tilfellet der du trenger å bli kjent med de ulike modifikatorer., De kan også påvirke entiteter og attributter som du kan få tilgang til innen arv hierarki.
Her er en rask oversikt over de ulike modifikatorer:
- Privat attributter eller metoder kan bare nås innen samme klasse.
- Attributter og metoder uten en access modifier kan nås innen samme klasse, og av alle andre klasser i samme pakke.
- Beskyttet attributter eller metoder kan nås innen samme klasse, med alle klasser i samme pakke, og av alle underklasser.,
- Offentlige attributter og metoder som kan nås av alle klasser.
Som du kan se på den listen, en underklassen kan få tilgang til alle beskyttet og offentlig attributter og metoder for superclass. Hvis underklassen og superclass tilhører den samme pakken, underklassen kan også få tilgang til alle pakke-privat attributter og metoder for superclass.
jeg gjøre det to ganger i konstruktøren av PremiumCoffeeMachine klasse.
jeg først bruker nøkkelordet super å kalle konstruktøren av superclass. Konstruktøren er offentlige, og underklassen kan få tilgang til den., Nøkkelordet super referanser på superclass. Du kan bruke den til å få tilgang til en attributt, eller å kalle en metode i superclass som blir overstyrt av gjeldende underklassen. Men mer om det i neste avsnitt.
beskyttet attributt configMap blir definert av BasicCoffeeMachine klasse. Ved å utvide denne klassen attributtet også blir en del av PremiumCoffeeMachine klasse, og jeg kan legge til konfigurasjonen som kreves for å lage en espresso til Kartet.,
– Metoden overordnede
Arv ikke bare legger til alle offentlige og beskyttet metoder for superclass til underklassen, men det lar deg også til å erstatte deres gjennomføring. Metoden for underklassen så overstyres en av de superclass. At mekanismen kalles polymorphism.
jeg bruker det i PremiumCoffeeMachine klasse til å utvide kaffebryggingssystem evner kaffemaskin. Den brewCoffee metoden for BasicCoffeeMachine metoden kan bare brygge filter kaffe.
jeg overstyre som metode i PremiumCoffeeMachine klassen for å legge til støtte for CoffeeSelection.,ESPRESSOMASKIN. Som du kan se i kodebit, super søkeord er svært nyttig hvis du overstyre en metode. Den brewCoffee metoden for BasicCoffeeMachine allerede håndterer CoffeeSelection.FILTER_COFFEE og kaster en CoffeeException for uegnet CoffeeSelections.
jeg kan bruke det i min nye brewCoffee metode. I stedet for reimplementing den samme logikken, jeg bare sjekke om CoffeeSelection er ESPRESSO. Hvis ikke det er tilfelle, jeg bruker super søkeord for å ringe brewCoffee metoden for superclass.,
Hindre en metode fra å bli overstyrt
Hvis du vil være sikker på at ingen underklassen kan endre gjennomføringen av en metode, kan du erklære det for å være endelig. I dette innlegget eksempel, jeg gjorde det for addBeans metoden for BasicCoffeeMachine klasse.
Det er ofte en god idé å gjøre alle metoder siste som er kalt av en konstruktør. Det hindrer noen fra underklassen, ofte ubevisst, endre atferden til konstruktøren.,
En underklassen er også av den typen sin superclass
En underklassen ikke bare arver egenskaper og metoder for superclass, men det er også arver typer av superclass. I eksempelet, BasicCoffeeMachine er av typen BasicCoffeeMachine og Objekt. Og en PremiumCoffeeMachine objektet er av typene PremiumCoffeeMachine, BasicCoffeeMachine, og Objekt.
på Grunn av dette, du kan kaste en PremiumCoffeeMachine objekt å skrive BasicCoffeeMachine.
BasicCoffeeMachinee coffeeMachine = (BasicCoffeeMachine) PremiumCoffeeMachine(beans);
Som gjør det mulig å skrive kode som bruker superclass og kjøre det med alle underklasser.,
I dette eksempelet kode av createCoffeeMachine metoden returnerer og makeCoffee metoden bruker BasicCoffeeMachine klasse. Men createCoffeeMachine metode instantiates en ny PremiumCoffeeMachine objekt. Når det blir returnert av metoden, objektet er automatisk kastet til BasicCoffeeMachine og koden kan ringe alle public metoder for BasicCoffeeMachine klasse.
coffeeMachine gjenstand blir kastet til BasicCoffeeMachine, men det er fortsatt en PremiumCoffeeMachine., Så når makeCoffee metoden kaller brewCoffee metode, det kaller overstyres metode på PremiumCoffeeMachine klasse.
Definerer abstrakte klasser
Abstrakte klasser er annerledes enn de andre klassene som vi har snakket om. De kan forlenges, men ikke startet. Det gjør dem ideelle til å representere konseptuelle generaliseringer som ikke eksisterer i den aktuelle domenet, men gjøre deg i stand til å bruke deler av koden din.
Du bruker nøkkelordet abstract å deklarere en klasse eller metode for å være abstrakt. En abstrakt klasse trenger ikke å inneholde noen abstrakte metoder., Men en abstrakt metode behov for å bli erklært av en abstrakt klasse.
La oss refactor kaffetrakter eksempel og innføre AbstractCoffeeMachine klasse som superclass av BasicCoffeeMachine klasse. Jeg erklærer at klasse som abstrakte og angi abstrakt brewCoffee metode.
public abstract class AbstractCoffeeMachine { protected Map<CoffeeSelection, Configuration> configMap; public AbstractCoffeeMachine() { this.configMap = new HashMap<CoffeeSelection, Configuration>(); } public abstract Coffee brewCoffee(CoffeeSelection selection) throws CoffeeException; }
Som du kan se, jeg gir ikke kroppen av det abstrakte brewCoffee metode. Jeg bare erklære det som jeg ville gjøre i et grensesnitt., Når du utvide AbstractCoffeeMachine klasse, må du definere den underklassen som abstrakte, eller overstyre brewCoffee metode for å implementere metoden kroppen.
jeg gjøre noen mindre endringer i BasicCoffeeMachine klasse. Nå utvider AbstractCoffeeMachine klasse, og de allerede eksisterende brewCoffee metode overstyrer abstrakt metode i superclass.
en Annen ting jeg har forandret er konstruktøren av BasicCoffeeMachine klasse. Det nå kaller konstruktøren av superclass og legger til nøkkel / verdi-par til configMap attributt uten å starte Kartet., Det er definert og lagt ved det abstrakte superclass og kan brukes i alle underklasser.
Dette er en av de viktigste forskjellene mellom en abstrakt superclass og et grensesnitt. Den abstrakte klassen ikke bare tillater deg å erklære metoder, men du kan også definere attributter som ikke er statisk og finalen.
Oppsummering
Som du har sett, arv er en kraftig konsept som gjør det mulig for deg å gjennomføre en underklassen som strekker seg en superclass. Ved å gjøre det, subclass arver alle beskyttet og offentlig attributter og metoder, og hvilke typer av superclass., Deretter kan du bruke den nedarvede egenskaper superclass, bruk eller overstyre arvet metoder, og kastet den underklassen til alle typer sin superclass.
Du kan bruke en abstrakt klasse for å definere en generell abstraksjon som ikke kan være lagt. Innenfor denne klassen, kan du erklære abstrakte metoder som trenger å bli overstyrt av ikke-abstrakte underklasser. Det er ofte brukt om gjennomføringen av denne metoden er spesifikk for hver subclass, men du vil definere en generell API for alle klasser i hierarkiet.