Gyakorlati alapok III.

Öröklődés (inheritance)

 

Örököltessünk síkidomból kört (konstruktor + getter-setter)!


Az absztrakt Sikidom osztállyal ebben a fejezetcsomagban először az Abstract osztály - abstract metódus című fejezetben találkozhattunk. Megállapítottuk: annyira általános tulajdonságokkal rendelkezik (ezek kerület és terület), hogy csak örökítéses kiindulópontként tudjuk felhasználni konkrét, származtatott síkidom-osztályokhoz, ilyenek lehetnek például: négyzet, téglalap, kör, stb.

 

Ebben a fejezetben az abstract módosítással ellátott Sikidom osztályból örökítéssel származtatunk egy Kor osztályt, mindeközben nagy gonddal ügyelünk a programozási konvenciók betartására, azaz származtatott osztályunk konstruktor-, és getter-setter-függvényeket is tartalmazni fog.

 

Bevezetésképpen ismételjük meg az abstract módosítással ellátott Sikidom osztály kódját:

 

public abstract class Sikidom {
    private double kerulet;
    private double terulet;

    public double getKerulet() {
        return this.kerulet;
    }

    public double getTerulet() {
        return this.terulet;
    }

    public void setKerulet(double kerulet) {
        if (kerulet < 0) {
            System.out.println("Az érték nem lehet negatív!");
        } else
        this.kerulet = kerulet;
    }

    public void setTerulet(double terulet) {
    if (terulet < 0) {
        System.out.println("Az érték nem lehet negatív!");
    } else {
        this.terulet = terulet;
        }
    }
}

 

A kód önmagában nem futtatható, ám ennek nincs is értelme, hiszen az abstract osztály csakis örökítési célokat szolgál.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Egy síkidomnak (mint fogalmi kiindulópontnak) csakis 2 olyan tulajdonsága lehet, amely aztán minden további síkidomra jellemző, ez pedig a kerület és terület, ezekhez tehát el lettek készítve a getter-setter függvények. A többit a származtatott Kor osztályban kell megvalósítanunk.

 

Gondolkodjunk el a következőn: mi hiányzik a Sikidom osztályból?

 

Nyilvánvalóan a síkidom oldalainak száma és hossza, hiszen azok síkidomtestenként különbözőek. Az oldalszám megállapítása nem olyan nehéz (a hossz pedig úgyis konkrét bemeneti adat, most nem lényeges):

Mindezek után építsük fel a Kor osztályt; ügyeljünk arra, hogy Sikidom és Kor osztályok azonos csomagban/projektben legyenek és a megfelelő négyzet bejelölésével illesszük be a main() főprogramot is:

 

www.informatika-programozas.hu

 

Először nézzük meg a keletkezett Java-kódot, majd utána részletezzük:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

public class Kor extends Sikidom {
    private double sugar;

    public double getSugar() {
        return sugar;
    }

    public void setSugar(double sugar) {
        if(sugar < 0) {
            System.out.println("A sugár értéke nem lehet negatív!");
        } else
        this.sugar = sugar;
    }

    public Kor(double sugar) {
        this.sugar = sugar;
        keruletSzamitas();
        teruletSzamitas();
    }

    private void keruletSzamitas() {
        setKerulet(this.sugar * 2 * Math.PI);
    }

    private void teruletSzamitas() {
        setTerulet(Math.pow(this.sugar, 2) * Math.PI);
    }

    public static void main(String[] args) {
        Kor kor = new Kor(1);
        System.out.println("Körkerület: " + kor.getKerulet());
        System.out.println("Körterület: " + kor.getTerulet());
        kor.setTerulet(-100);
        kor.setSugar(-2);
        }
    }

 

Végeredmény:

Körkerület: 6.283185307179586
Körterület: 3.141592653589793
Az érték nem lehet negatív!

A sugár értéke nem lehet negatív!

  1. Sikidom osztályból Kor osztályt az extends paranccsal származtattunk - public class Kor extends Sikidom,

  2. a konkrét körszámításokhoz be kellett hoznunk a private double sugar változót, illetve meg kellett alkotnunk a hozzá tartozó getter-setter függvényeket (amely művelet egyébiránt automatizálható az Automatizáljunk! című fejezet szerint),

  3. a konstruktor függvényben kapcsolatot kell teremtenünk ezen deklaráció és a konstruktor függvény bemeneti paraméterlistájában szereplő deklaráció között (public Kor(double sugar)), mert a rendszer nem tudja, hogy a 2 változó voltaképpen ugyanaz, legalábbis ez a szándékunk - this.sugar = sugar,

  4. a setKerulet és setTerulet már a Sikidom osztályban elvégzett egy alapszintű bemeneti adatellenőrzést: nem engedett 0-nál kisebb értéket a rendszerbe, erről konzolos értesítést is küldött. Bemeneti paramétereikként pedig beküldtük a számítási képleteket (this.sugar * 2 * Math.PI és Math.pow(this.sugar, 2) * Math.PI),

  5. mindezt belepakoltuk a keruletSzamitas() és teruletSzamitas() metódusokba, amelyeket viszont a Kor osztály konstruktorába tettünk bele, felüldefiniálva ezzel az eredeti, szimpla konstruktort.

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Vegyük észre, hogy bár úgy tűnik, a Sikidom osztály van a hierarchia tetején, de ez mégsem igaz, mert a built-in code completion lehetőségével (sikidom.) egyúttal elérhetjük az Object osztály összes metódusát. Ez azt jelenti, hogy a Sikidom osztályt a Java-rendszer az Object osztályból automatikusan származtatta.