Articles

OOP Concept aloittelijoille: mikä on perintö?

Perintö on yksi keskeiset käsitteet olio-ohjelmointi (OOP) kielet. Se on mekanismi, jossa voit johtaa luokan toisesta luokasta sellaisten luokkien hierarkiassa, joilla on joukko attribuutteja ja menetelmiä.

voit sen avulla julistaa erilaisia poikkeuksia, lisätä mukautetun logiikan olemassa oleviin kehyksiin ja jopa kartoittaa verkkotunnusmallisi tietokantaan.,

julistaa Javalla perintöhierarkian

, jokainen luokka voidaan johtaa vain yhdestä muusta luokasta. Kyseistä luokkaa kutsutaan superluokaksi eli vanhempainluokaksi. Johdettua luokkaa kutsutaan alaluokaksi eli lapsiluokaksi.

käytät avainsanaa, joka ulottuu alaluokkasi ylittävän luokan tunnistamiseen. Jos et julista superluokkaa, luokkasi laajentaa implisiittisesti Luokkaobjektia. Objekti on kaikkien perintöhierarkioiden juuri; se on Jaavan ainoa luokka, joka ei laajenna toista luokkaa.

seuraavassa kaaviossa ja koodinpätkissä on esimerkki yksinkertaisesta perintöhierarkiasta.,

Luokka BasicCoffeeMachine ei julista superluokkaa ja laajentaa implisiittisesti luokkaobjektia. Voit kloonata CoffeeMachine-esimerkkiprojektin GitHubilla.

Luokka PremiumCoffeeMachine on BasicCoffeeMachine-luokan alaluokka.

perintö-ja käyttöoikeusmuunnokset

Käyttöoikeusmuunnokset määrittelevät, mitkä luokat voivat käyttää attribuuttia tai menetelmää. Yhdessä aiemmista kapselointia käsittelevistä viesteistäni näytin teille, miten voisitte käyttää niitä tietojen piilottamiseen. Mutta se ei ole ainoa tapaus, jossa sinun täytyy tuntea eri muokkaajat., Ne vaikuttavat myös yhteisöjen ja ominaisuudet, joita voit käyttää sisällä perintö hierarkia.

Tässä on nopea katsaus eri määritteet:

  • Yksityinen ominaisuuksia tai menetelmiä voidaan käyttää vain samassa luokassa.
  • Määritteet ja menetelmät ilman access modifier voi käyttää saman luokan, ja kaikki muut luokat samassa paketissa.
  • suojattuja attribuutteja tai menetelmiä voi käyttää samassa luokassa, kaikissa saman paketin luokissa ja kaikissa alaluokissa.,
  • julkisiin ominaisuuksiin ja menetelmiin voi tutustua kaikissa luokissa.

Kuten voit nähdä, että luettelo, alaluokka voi käyttää kaikkia protected ja public ominaisuudet ja menetelmät yliluokka. Jos alaluokka yliluokka ja kuuluvat samaan pakettiin, alaluokka voi myös käyttää kaikkia paketti-yksityiset attribuutit ja metodit yliluokka.

teen sen kahdesti PremiumCoffeeMachine-luokan konstruktorissa.

haluan ensin käyttää avainsanaa super soittaa rakentajan yliluokka. Rakentaja on julkinen, ja siihen pääsee alaluokalla., Avainsana super viittaa yliluokka. Voit käyttää määritettä, tai soittaa menetelmä yliluokka, joka saa ohittaa nykyisen alaluokka. Mutta lisää siitä seuraavassa jaksossa.

suojattu määrite configMap saa määrityksen BasicCoffeeMachine-luokasta. Laajentamalla luokan, attribuutin tulee myös osa PremiumCoffeeMachine luokan, ja voin lisätä, kokoonpano, että on tarpeen hautua espresso Kartalla.,

ensisijainen Menetelmä

Perintö ei vain lisää julkista ja suojattu menetelmiä yliluokka teidän alaluokka, mutta se myös avulla voit vaihtaa niiden toteuttamista. Tämän jälkeen alaluokan menetelmä ohittaa superluokan menetelmän. Tätä mekanismia kutsutaan polymorfismiksi.

käytän, että PremiumCoffeeMachine luokan laajentaa kahvia panimo-ominaisuuksia kahvinkeitin. BasicCoffeeMachine-menetelmän brewCoffee-menetelmällä voidaan valmistaa vain suodatinkahvia.

– en ohittaa, että menetelmä PremiumCoffeeMachine luokan lisätä tukea CoffeeSelection.,ESPRESSO. Kuten näet koodin pätkässä, Super avainsana on erittäin hyödyllinen, jos ohitat menetelmän. Basiccoffeemachinen brewCoffee-menetelmä hoitaa jo Kahvinvalinnan.FILTER_COFFEE ja heittää Kahvinexception varten tukematon CoffeeSelections.

voin käyttää sitä uudelleen uudessa brewCoffee-menetelmässäni. Sen sijaan, että miettisin samaa logiikkaa uudelleen, tarkistan vain, onko Kahvinvalinta espressoa. Jos näin ei ole, käytän Super avainsanaa kutsuakseni brewcoffee-menetelmää superclassiksi.,

Estää menetelmä on ohittaa

Jos haluat varmistaa, että alaluokka voi muuttaa täytäntöönpano menetelmä, voit ilmoittaa sen olevan lopullinen. Tässä postitse esimerkki, tein sen varten addBeans menetelmä BasicCoffeeMachine luokan.

usein on hyvä tehdä kaikki menetelmät lopullisiksi, joita rakentaja kutsuu. Se estää minkä tahansa alaluokan, usein tahattomasti, muuttamasta rakentajan käyttäytymistä.,

alaluokka on myös tyyppi sen yliluokka

alaluokka ei vain perii ominaisuuksia ja menetelmiä yliluokka, mutta se myös perii eri yläluokaksi. Esimerkissä BasicCoffeeMachine on tyyppiä BasicCoffeeMachine ja Objekti. Ja PremiumCoffeeMachine objekti on tyyppiä PremiumCoffeeMachine, BasicCoffeeMachine, ja objekti.

tästä johtuen voit heittää Kantaesimakiiniesineen tyypin BasicCoffeeMachine.

BasicCoffeeMachinee coffeeMachine = (BasicCoffeeMachine) PremiumCoffeeMachine(beans);

Sen avulla voit kirjoittaa koodia, joka käyttää yliluokka ja suorittaa kaikki alaluokkaan.,

tässä esimerkissä createCoffeeMachine-menetelmän koodi palaa ja makeCoffee-menetelmässä käytetään BasicCoffeeMachine-luokkaa. Mutta createCoffeeMachine menetelmä instantioi uuden PremiumCoffeeMachine objekti. Kun se palautetaan menetelmällä, objekti valetaan automaattisesti Basiccoffeemachinelle ja koodi voi kutsua kaikkia BasicCoffeeMachine-luokan julkisia menetelmiä.

coffeeMachine esine saa valettu BasicCoffeeMachine, mutta se on silti PremiumCoffeeMachine., Joten kun makeCoffee menetelmä vaatii brewCoffee menetelmä, se vaatii yliohjatut menetelmä PremiumCoffeeMachine luokan.

Määritellään abstraktit luokat

Abstraktit luokat ovat erilaisia kuin muut luokat, joista olemme puhuneet. Niitä voidaan laajentaa, mutta ei asentaa. Tämä tekee niistä ihanteellisia edustaa käsitteellisiä yleistyksiä, joita ei ole olemassa oman verkkotunnuksen, mutta voit käyttää uudelleen osia koodin.

käytät avainsanaa Abstrakti julistaaksesi luokan tai menetelmän abstraktiksi. Abstraktin luokan ei tarvitse sisältää mitään abstrakteja menetelmiä., Abstrakti menetelmä on kuitenkin julistettava abstraktilla luokalla.

oletetaan, refactor kahvinkeitin esimerkki ja esitellä AbstractCoffeeMachine luokan yliluokka ja BasicCoffeeMachine luokan. Julistan luokan abstraktiksi ja määrittelen abstraktin brewCoffee-menetelmän.

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; }

Kuten näette, en voi antaa kehon abstrakti brewCoffee menetelmä. Julistan sen niin kuin tekisin rajapinnassa., Kun laajennat AbstractCoffeeMachine-luokkaa, sinun on määriteltävä alaluokka abstraktiksi tai ohitettava brewCoffee-menetelmä menetelmän toteuttamiseksi.

teen pieniä muutoksia BasicCoffeeMachine-luokkaan. Se laajentaa nyt AbstractCoffeeMachine-luokkaa, ja jo olemassa oleva brewCoffee-menetelmä ohittaa superluokan abstraktin menetelmän.

toinen asia, jonka muutin, on BasicCoffeeMachine-luokan konstruktori. Se nyt vaatii rakentajan yliluokka ja lisää avain-arvo-pari configMap ominaisuus ilman instantiating Kartta., Se on määritelty ja instantiated, jonka abstrakti yliluokka ja sitä voidaan käyttää kaikissa alaluokkia.

Tämä on yksi tärkeimmistä eroista abstrakti yliluokka ja käyttöliittymä. Abstraktin luokan avulla voit julistaa menetelmiä, mutta voit myös määritellä attribuutteja, jotka eivät ole staattisia ja lopullisia.

Tiivistelmä

Kuten olette nähneet, perintö on tehokas konsepti, jonka avulla voit toteuttaa alaluokka, joka ulottuu yliluokka. Näin alaluokka perii kaikki suojatut ja julkiset attribuutit ja menetelmät sekä superluokan tyypit., Voit sitten käyttää perinyt ominaisuuksia yliluokka, käyttää tai ohittaa perinyt menetelmiä, ja heittää alaluokka tahansa sen yliluokka.

abstraktin luokan avulla voidaan määritellä yleinen abstraktio, jota ei voi instantioida. Sisällä tämän luokan, voit ilmoittaa abstrakteja menetelmiä, jotka täytyy ohittaa ei-abstrakti alaluokkia. Tätä käytetään usein, jos kyseisen menetelmän toteutus on kullekin alaluokalle erityinen, mutta haluat määritellä yleisen API: n kaikille hierarkian luokille.