JAVA: öröklődés probléma?
Üdv!
Minden létező dokumentációban az van leírva, hogy egy osztály nem örökli a szülő osztály konstruktorát, csak annak metódusait, stb.
Ennek ellenére, amikor extendelni akarok egy osztályt a szülőre, hibát jelez, és a szülő konstruktorát kéri. Magyarosabban:
Adott A osztály melyhez a következő konstruktor társul: A(int valami)
Ezután létrehozok egy B osztályt, melyet nem tudok örököltetni, hacsak létre nem hozok B-hez egy ugyanolyan mintájú konstruktort(B(int valami). Csakhogy nyilván nem ugyanolyan adatokat, metódusokat akarok B osztályba tenni, annak ellenére, hogy A leszármazottja.
Mi itt a probléma?
Nincs itt semmiféle probléma, csak nem olvastad el rendesen és nem értelmezed azt a nyamvadt hibaüzenetet, ráadásul még ide sem sikerült bemásolnod se a kódot, se a hibaüzenetet. Fail.
A probléma pedig a következő:
Ha egy leszármazott osztályt példányosítasz, akkor mielőtt lefutna a leszármazott osztály konstruktora, le fog futni az ős osztály konstruktora is.
Ha nem adtad meg explicit másképp, akkor ez mindig a default konstruktort jelenti. A probléma ott van nálad, hogy az ősosztályodnak nincs default konstruktora, így a fordító nem tudja mit hívjon.
Te ezt tévesen úgy értelmezted, hogy a leszármazott osztálynak kell plusz konstruktort írnod, valójában pedig csak meg kéne mondani, hogy az ősosztály melyik konstruktora milyen paraméterekkel hívódjon meg.
Tipikus megoldása ennek az "A() : B(0)" forma. (0 helyén állhatna bármilyen más szám, amit az üzleti logika megkövetel.)
Írtál egy gyanús mondatot: "Csakhogy nyilván nem ugyanolyan adatokat, metódusokat akarok B osztályba tenni, annak ellenére, hogy A leszármazottja."
Ez meg arra enged következtetni, hogy itt tervezési hiba is van. Ha nem tudod úgy példányosítani a leszármazott osztályt, hogy az ősosztályt megfelelően inicializálni tudd, akkor a leszármazás nem alkalmazható és Te valójában valami mást szerettél volna megvalósítani.
"Mivel a leszármazott osztályból példányosított objektum a szülő típusú változójába is betehető, muszáj ugyan azoknak a konstruktoroknak meglennie"
Ez szimplán nem igaz, lásd a példa amit írtam.
Liskov-féle hellyettesítési elvet akarod megsérteni:
Minden metódust amit implementál egy ősosztály, meg kell valósítania a leszármazottnak is. A legtöbb függvény esetén simán a java megoldja, hogy az ősosztályét hívja akkor, de konstruktort nem tud úgy készíteni, mert akkor a leszármazottként nem tudnád példányosítani.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!