C# ben hogyan lehetséges az, hogy ha egy object típushoz ha hozzárendelek egy származtatottat akkor az object ből visszafejthető származtatott típusá?
Például.
object o = new Animal();
Animal a = (Animal)o;
Ez,azért lehetséges mert az object az alapból kontravariáns?
Az érthető számomra,hogy egy származtatott típus castolódik bázis típusra de egy bázis típusból mégis,hogyan lehet kinyerni egy származtatott típust ha egyszer nem tartalmazza azt?
int i = 10;
object o = i; //Ez azért jó mert i egy object is.
Ha igaz amit írsz akkor nincs castolás.
Egyszerűen akkor itt csak egy olyan memóriacím kerül bele az o mutatóba amin keresztül csak az object osztály adattagjait lehet elérni ugye?
Amikor pedig ezt írom: o.ToString()
Akkor hogy lehet az,hogy az int értékét vissza tudja adni?
Hisz a mutatón keresztül jelenleg csak az object osztály dolgait érhetjük el az intet pedig nem.
Ha a ToString virtuális metódus akkor érthető de nem az.
Itt megállt a tudományom, mert C#-hoz nem igazán értek, max Java-hoz
Ott ez nem egészen így megy, mert van autoboxing, meg miegymás, ha C-ban is így van, akkor ez a keresőszavad, ha meg nem, akkor majd megmondja valaki
hm megnéztem virtuális a tostring ez esetben értem már.
A vpt táblázatot azt jól ismerem és a működését is.
Átgondoltam a dolgokat.
Akkor ez így történik?:
Ezeknél a műveleteknél castolás(ollózás) nem történik.
A példában van egy 'o' mutatónk amihez hozzá lehet rendelni az Animal osztály adataira mutató memóriacímet.
De mivel a mutató típusa object ezért nem lássa az Animal részét.Ahhoz hogy újból láthassa az Animal részt explicit módon kell hozzárendelni egy Animal típushoz.
gyakorlatilag igen
tehát ollózás helyett úgymond "letakarás" történik, a mutató típusa csak azt mondja meg, hogyha a mutatót használjuk, akkor azon mondjuk milyen metódust hívhatsz, de ennyi
Az object típusú referencia mutathat bármilyen objektumra.
Szedd szét a fenti példát:
object o;
o = new Animal();
létrehoztál egy object típusú referenciát, amely egy Animal típusú objektumra mutat. Az o az Animal típusú objektumodat object típusú objektumként kezeli. Ettől még maga az adat a heapen valójában egy Animal objektum. Ha GetType-pal lekéred a típusát akkor (mivel az az adat típusát adja vissza) azt fogod látni, hogy az o egy Animalra mutat (tehát azt kapod eredményként, hogy YourClass.Animal).
Ez nem csak az object esetén van így, hanem minden származtatás esetén.
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!