Kezdőoldal » Számítástechnika » Programozás » JAVA: öröklődés probléma?

Mirk kérdése:

JAVA: öröklődés probléma?

Figyelt kérdés

Ü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?



2019. máj. 5. 21:47
 1/4 anonim ***** válasza:
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. Ha nem akarsz újat írni, egy super(valami) hívással a leszármazottban a szülő konstruktorát fogod meghívni, így neked nem kell újat írni.
2019. máj. 5. 22:02
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:

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.

2019. máj. 5. 22:08
Hasznos számodra ez a válasz?
 3/4 anonim ***** válasza:

"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.

2019. máj. 5. 22:14
Hasznos számodra ez a válasz?
 4/4 anonim ***** válasza:
49%

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.

2019. máj. 5. 22:22
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!