Kurssisisältö
Java OOP
Java OOP
OOP-Periaatteet: Abstraktio
Abstraktio
Olemme nyt saapuneet viimeiseen, mutta erittäin tärkeään OOP-periaatteeseen: Abstraktio. Sana "abstraktio" kuulostaa melko abstraktilta, ja lyhyesti sanottuna tämä periaate kertoo, että tulisi tukeutua abstraktioon eikä tiettyyn toteutukseen. Tämä saattaa kuulostaa monimutkaiselta nyt. Aloitetaan kuitenkin määritelmästä:
Esimerkiksi meillä on luokka nimeltä Person,
, josta periytyy monia erilaisia luokkia. Person
-luokalla on erilaisia kenttiä ja metodeja, jotka ovat yhteisiä kaikille luokille. Kun meillä on luokka nimeltä BasketballPlayer,
, height
-ominaisuudesta tulee olennaisen tärkeä, kun taas luokassa Driver
height
on epäolennainen eikä merkityksellinen. Tässä kohtaa abstraktio astuu kuvaan. Periytymällä abstraktiosta voimme tehdä height
-parametrista valinnaisen, jolloin sitä ei tarvitse käyttää siellä, missä se ei ole tarpeellinen.
Tämä saattaa kuulostaa monimutkaiselta, joten siirrytään esimerkkiin:
Car.java
public abstract class Car { String model; int year; int maxSpeed; String color; public abstract void move(); public abstract void stop(); }
Luokka Car
ei edusta mitään tiettyä. Ei ole olemassa pelkästään Car
-nimistä asiaa; on sedaneita, kuorma-autoja, traktoreita. Siksi tukeudumme abstraktioon nimeltä Car
. Yksinkertaistettuna:
Car
on pohja, jonka perusteella luomme tiettyjä autoluokkia.
Kiinnitä huomiota syntaksiin:
Tämä on syntaksi abstraktin luokan määrittelyyn. Huomaa myös abstraktin metodin määrittelyn syntaksi:
Abstraktilla metodilla ei ole runkoa; tämä on sen pääominaisuus. Abstraktin luokan aliluokat ylikirjoittavat tämän abstraktin metodin määritelläkseen oman toteutuksensa käyttäen polymorfismia.
Tarkastellaan tarkemmin, mitä abstrakti luokka on:
Huomaa, että abstraktista luokasta ei voi luoda oliota; se johtaa virheeseen:
Abstraktit luokat vapauttavat meidät käsittelemästä pelkkiä "olioita"; ne tarjoavat meille perustilan ja käyttäytymisen. Auto-esimerkissä jokaisella autolla tulisi olla malli, valmistusvuosi, huippunopeus ja väri. Niiden tulisi myös pystyä liikkumaan ja pysähtymään. Siinä kaikki; tästä eteenpäin suunnittelet tietyt luokkasi tämän abstraktin pohjan perusteella.
Säännöt abstraktin luokan luomiseen
Abstrakti luokka on luokka, joka sisältää vähintään yhden abstraktin metodin. Voit luoda abstraktin luokan ilman abstrakteja metodeja, mutta silloin sillä ei ole tarkoitusta. Et voi luoda abstraktin luokan olioita;
Abstrakteja metodeja voi olla vain abstraktissa luokassa; et voi luoda abstrakteja metodeja luokan ulkopuolella;
Abstraktissa luokassa metodit voivat olla joko abstrakteja metodeja tai toteutettuja metodeja;
Luokan, joka perii abstraktin luokan, täytyy ylikirjoittaa kaikki abstraktit metodit;
Voit periä korkeintaan yhden luokan (abstraktin tai ei-abstraktin);
Abstraktin luokan tulisi edustaa perivien luokkien yhteisiä ominaisuuksia ja käyttäytymistä. Käsittelemme tätä tarkemmin, kun opiskelemme SOLID-periaatteita.
Tarkastellaan esimerkkiä, jonka avulla ymmärrämme, miten aliluokkien tulisi ylikirjoittaa abstraktit metodit perimällä abstrakti luokka, käyttäen esimerkkinä lapsiluokkaa Truck
:
Tässä on kuvakaappauksessa oleva koodi, kirjoitettu uudelleen paremman luettavuuden ja selkeyden vuoksi:
Car.java
Truck.java
Main.java
public abstract class Car { String model; int year; int maxSpeed; String color; public abstract void move(); public abstract void stop(); }
Tarkastellaanpa yllä olevaa sisältöä yksityiskohtaisemmin:
Ensimmäinen dia: Luodaan aliluokka
Truck
, joka perii abstraktin luokanCar
. IDE kehottaa toteuttamaan vaaditut metodit;Toinen dia: Ylikirjoitetaan tarvittavat metodit. Esimerkiksi määritellään, että
Truck
on lähtenyt liikkeelle ja sitten pysähtynyt;Kolmas dia: Luodaan olio
main
-metodissa. Kiinnitä huomiota käytettyyn syntaksiin:Car name = new Truck();
. Olion luominen aloitetaan abstraktiosta ja päätetään toteutukseen. Tätä kutsutaan koostamiseksi. Tämän jälkeen kentille asetetaan tarvittavat arvot ja kutsutaan ylikirjoitettuja metodeja.
Voilà! Jos ymmärsit kaiken, olet oppinut käyttämään abstraktia luokkaa!
Yhteenveto
Abstraktio on luultavasti haastavin OOP-periaate ymmärtää, ja on hyvin mahdollista, ettet ole vielä sisäistänyt kaikkea. Mutta älä luule olevasi yksin tämän kanssa. Abstraktio on käsite, joka on aluksi vaikea useimmille kehittäjille. Ajan myötä opit ymmärtämään paremmin, miten työskennellä tehokkaasti abstraktion ja abstraktien luokkien kanssa. Abstraktio on keskeinen periaate, koska sen avulla ohjelmistamme tulee laajennettavia ja erittäin joustavia.
1. Mitä abstraktio tarkoittaa olio-ohjelmoinnissa?
2. Mitkä seuraavista väittämistä pitävät paikkansa abstraktiosta?
3. Mikä on abstraktin luokan tarkoitus Javassa?
4. Miten abstraktio edistää koodin ylläpidettävyyttä?
Kiitos palautteestasi!