Kezdőoldal » Számítástechnika » Programozás » C++-ban hogy tudom C# szerűen...

C++-ban hogy tudom C# szerűen használni az öröklés előnyeit? Hogyan tudok egyszerűen generikus tárolót csinálni és utólag cast-olgatni az elemeket felhasználás szerint?

Figyelt kérdés
C#-ban kézenfekvő ha egy olyan listába dobálom az elemeket, ami az ősosztály típusával lett létrehozva. Utólag "is" "as" kulcsszavakkal is könnyen tudom ellenőrizni az adott elem típusát és aszerint ki cast-olni. Ha ugyanezt akarom C++-ban megcsinálni akkor azt csak 2-3-szor annyi kóddal tudom megoldani. Ki lehet küszöbölni valahogy a párhuzamos tárolók vagy smart pointerek bevezetését illetve a típus ellenőrzéshez az osztályazonosító változók bevezetését?
2018. máj. 24. 15:15
1 2
 11/15 sharkxxx ***** válasza:

C++-ban a "typeid" operátort és a "dynamic_cast" kulcsszót kell használni a C#-os "is" "as" megvalósítására.

Itt van egy példa: [link]

2018. máj. 25. 00:12
Hasznos számodra ez a válasz?
 12/15 anonim ***** válasza:
49%
#9 Persze, egy lehetőség. Ahogy az is egy lehetőség, hogy nem hányod tele a kódodat goto-kkal. Egy lehetőség, amit erősen javallott betartani, hacsak nem valami speciális esetről van szó, ahol rettentő fontos. Ha származtatott példányokat ősosztály típusával deklarált listába pakolsz csak azért, hogy utána visszacastolgasd őket, akkor ott rendszerint tervezési hiba van. Lássuk be elég idétlenül hangzik a szisztéma, hogy egy kalapba pakoljuk az összes különböző példányt, utána meg egyesével kivesszükük a kalapból, és mindegyikről eldöntjük, hogy akkor ez pontosan mifajta, és az alapján csináljunk vele valamit. Már csak azért is, mert ez a fabrikálós módszer szinte mindig kiküszöbölhető az osztályhierarchia áttervezésével.
2018. máj. 25. 01:10
Hasznos számodra ez a válasz?
 13/15 anonim ***** válasza:

"származtatott példányokat ősosztály típusával deklarált listába pakolsz csak azért, hogy utána visszacastolgasd őket"


Ez igazából a feladattól függ. Például ha van egy Animal ős osztály, amiből különböző fajta állatokat származtatunk, akkor kellhet olyan tömb (lista, stb.), amibe valamilyen szempont szerint akarok bizonyos állatokat összegyűjteni, hogy a közös tulajdonságaiból csináljak valami lekérdezést, statisztikát, akármit. Ilyenkor pl. nem kell cast-olni őket.

Vagy mondjuk a képernyőn ablakokat, kontrollokat (widget-eket) akarok összegyűjteni egy megjelenítéshez, felsoroláshoz, akkor sem feltétlenül kell cast-olni, mert az adott műveletnél csak a közös viselkedésüket vagy tulajdonságaikat használom.

Tudom, ezek speckó feladatok, csak arra utalok, hogy ez mindig az adott feladattól függ.

2018. máj. 25. 06:06
Hasznos számodra ez a válasz?
 14/15 anonim ***** válasza:

Ezt kicsit benézted, mert a kezdőtőtől már azért jóval odébb vagyok, de persze az embernek mindig van még mit tanulnia.


Azzal egyetértek, hogy így feketén fehéren sehol nincs leírva, hogy ne csináld. Amire talán rá tudom részben húzni az a SOLID elvek közül a Liskov féle helyettesítési elv. De az se teljesen ezt mondja. Na de kódminőség és design terén eléggé sok szubjektív és részben íratlan szabály van. Például ilyen a hatalmas switch-case szerkezetek kerülése is (ami mellesleg sokszor pont öröklődéssel lehet kijátszani). Amit te írsz viszont, hogy minden subclasson másik metódust akarsz meghívni, ezt több subclass esetén szintén csak egy nagy switch case-el tudod megoldani. Már csak ezért sem tartom elegánsnak. Ettől független el tudok képzelni olyan helyzetet, ahol az általad leírt megoldást választanám, de ettől még nem tartom elegánsnak.

2018. máj. 25. 06:58
Hasznos számodra ez a válasz?
 15/15 anonim ***** válasza:
#13 Amit felsoroltál, ott nincs szükség visszacastolásokra, mert az ősosztály által biztosított interface elegendő. De én nem is arról beszéltem, hogy egy ős-listába pakolod a származtatott elemeket, hanem egy ős-listába pakolod őket ÉS utána visszacastolod, mert neked mégiscsak kellenek a konkrét osztályo ktulajdonságai. Na EZ már nagyon specifikus példáktól eltekintve tervezési hibára utal.
2018. máj. 25. 12:41
Hasznos számodra ez a válasz?
1 2

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!