Kezdőoldal » Számítástechnika » Programozás » Miért használjuk java programn...

Miért használjuk java programnyelvben az objektumoknál az explicit típusátalakítás (downcasting) és implicit (upcasting) típusátalakítást?

Figyelt kérdés
A problémám igazából az, hogy nem látom át mi értelme van ezeknek, változóknál tiszta, de amikor objektumokat kasztolunk nem értem miért akarjuk beletenni a szülő osztály objektumát a gyermek osztály objektumába, illetve fordítva? Például implicitnél, miért nem csak egyszerűen örököltetjük a tulajdonságokat?

2016. aug. 21. 20:05
 1/8 anonim ***** válasza:

Házasságot kötött a gyerek, vezessük be a házastárs nevét.

Erre biztos van jobb példa, de eddig megúsztam nélküle.

2016. aug. 21. 21:10
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:

Nem kellett? Dehogynem!

Amikor streambe írsz, akkor egy általános, Objekteket kiíró metódust használsz. Amikor a kiírottakat visszaolvasod, akkor egy Objekt jön vissza, de magától nem ismeri fel a rendszer, hogy ez mi, úgyhogy kénytelen vagy visszacastolni.

2016. aug. 21. 21:16
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:
Java-ban nem vagyok otthon, de általában azért (is) szoktak cast-olni, mert mondjuk egy ősre mutató pointerrel akarsz egy gyerekre mutatni. Ez olyankor érdekes, mikor pl. egy konténerben gyűjtesz közös ősű objektumokat. Pl. van egy konténered, ami állatokra mutató pointerekből áll, és abba tudsz gyűjteni elefántot, macskát, stb. Ilyenkor pl. a macskát cast-olod az állat őssé. Ha meg használni akarod, pl. a konténer egy macska elemének akarod hívni a nyávog metódusát, akkor először cast-olnod kell macskává, mivel az állat osztálynak nem lesz ilyen metódusa, nem fog működni.
2016. aug. 21. 21:19
Hasznos számodra ez a válasz?
 4/8 A kérdező kommentje:

Köszönöm mindenkinek választ! Nekem az nem világos, hogy: maradjunk az állatos példánál. Van az állat osztályom(Animal), ő lesz a ősosztály és van a gyermekosztály a macska(Cat). A macska osztály örököl mindent az állat osztálytól.


Animal allat = new Animal();

Cat macska = new Cat();

Létrehoztam az adott osztályból egy objektumot, ezt értem is.


Számomra az nem világos amikor:

Animal allat2 = new Cat();


Miért akarnék az allat2-ben tárolni egy macska objektumot?


Fordítva meg végképp elvesztem a fonalat:

Animal allat3 = new Animal();

Cat macska 3 = (Cat) allat3;

Itt világos, hogy kasztolunk, az is, hogy meg kell neki mutatni, hogy milyen objektum. Az nem érthető, hogy miért nem elegendő csak simán létrehozni a macska osztályból egy macska objektumot, miért kell/lehet az előbb leírt módon, mint pl. a JPanel osztálynál a Graphics objektumnál?


Hu, kicsit hosszúra sikeredett, ha valaki ezt megválaszolná, örülnék :D Köszi előre is!

2016. aug. 21. 22:29
 5/8 anonim ***** válasza:

A 3-as példa helytelen, mert amit létrehoztál, az Animal, de nem Cat, így abból ClassCastException lesz.


Rég Swingeztem már, de elmékeim szerint a Graphics egy AWT osztály és semmi közük egymáshoz a JPanellel (öröklődési szinten), így nehezem hiszem, hogy egyiket a másikba kellene castolni, hacsak felhasználó fejlesztő (jelen esetben te, vagy akitől ilyen kódot látták) nem csűrt el valamit nagyon csúnyán a saját kódjában.


A Grahpics talán mintha volna néha Graphics2D-vé konvertálva...

Ebben az esetben ugyanaz érvényes, mint alább:


Az "upcasting", ahogyan előttem már írta a 2-es kolléga, akkor használatos, amikor biztos vagy egy adott példány típusában, de csak ősosztály típusként tudod valahonnan lekérni.


Egy ergya példa:


interface Animal {

˙˙˙˙void sayHello();

}


...


class Cat implements Animal {

˙˙˙˙@Override

˙˙˙˙public void sayHello() {

˙˙˙˙˙˙˙˙System.out.println("meow");

˙˙˙˙}


˙˙˙˙public void scratch() {

˙˙˙˙˙˙˙˙// No fuckin' idea

˙˙˙˙}

}


...


List<Animal> stuff = Arrays.asList(new Cat(), new Dog(), new RohadtMindegyMilyenAnimal());


...


/**

* Itt biztosak vagyunk benne, hogy stuff[0] egy Cat,

* hiszen mi tettük azt oda, ám mivel stuff típusa List<Animal>,

* a List#get metódus visszatérési értéke is Animal lesz, így castolnunk kell,

* máskülönben a Cat#scratch metódushoz nem férünk hozzá.

*/

Cat cat = (Cat) stuff.get(0);

cat.scratch();



"Miért akarnék az allat2-ben tárolni egy macska objektumot?"


Mert ez sokszor célravezetőbb. Pl. a fentebb található listába bármilyen állatot betehetek, és ahová csak Animal kell, oda mind tökéletesen meg fog felelni. Ez a polimorfizmus, ami az OO egy elég fontos tulajdonsága, ezen alapszanak a mindenhol használt absztrakciók (azokon pedig többekközt a Dependency Injection, ami simán veri a szeletelt kenyeret).


Ha szabad ajánlanom Robert C. Martintól a Clean Code: A Handbook of Agile Software Craftsmanship című könyvet, mindenképpen olvasd el, mert nemcsak sokmindenre választ ad, de rengeteg advanced dolgot is tanulhatsz belőle, amiből sokat lehet profitálni.

2016. aug. 22. 00:11
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

Szerintem ott a probléma, hogy nem érted (vagy csak nem veszed észre), hogy az osztály meg a példány az nem ugyanaz.


"Például implicitnél, miért nem csak egyszerűen örököltetjük a tulajdonságokat?"


Ilyen nincs, ha egyszer castolsz valamit, akkor azt már miből örököltetnéd?

2016. aug. 22. 00:28
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:
Ismételten köszönöm mindenkinek! Utolsó hozzászóló, tisztában vagyok vele, hogy az osztály egy példánya az objektum. Valóban hülyén fogalmaztam meg a kérdést :D A lényeg az lett volna benne, hogy miért butítjuk le az objektumunkat? Az állatos példára visszavezetve, miért jó nekem ha a macska változóban tárolok egy állat objektumot? :)
2016. aug. 22. 00:49
 8/8 A kérdező kommentje:
De ezt előttem már az 5-ös hozzászóló érthetően leírta, köszönöm!
2016. aug. 22. 00:52

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!