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.
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):
-
a körszámításhoz 1 db hosszadat szükséges, ez pedig a sugár (r);
-
a négyzetszámításhoz szintén 1 db hosszadat szükséges, ez a oldalhossz;
-
a téglalap-számításhoz 2 db hosszadat szükséges, ez a és b oldalhossz;
-
a háromszög-számításhoz 3 db hosszadat szükséges, ez a és b és c oldalhossz;
-
stb.
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:
Először nézzük meg a keletkezett Java-kódot, majd utána részletezzük:
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!
-
Sikidom osztályból Kor osztályt az extends paranccsal származtattunk - public class Kor extends Sikidom,
-
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),
-
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,
-
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),
-
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.
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.