C#-ban öröklésnél hogy kell típuskasztolni?
"Visszafelé" nem kell. Tehát ha van egy AkcióFilm objektumod, az egyben Film is.
Film f = new AkcióFilm();
Ez azért van, mert az AkcióFilm "tud minden olyan dolgot", amit a Film "tud".
Visszafelé ez azonban már nem biztos, hogy így van. Egy Film nem biztos, hogy "tud mindent", amit egy AkcióFilm "tud". És itt lesz lényeges két fogalom, a statikus típus és a dinamikus típus.
Röviden fogalmazva, a statikus típus azt jelenti, hogy milyen típusú például a változód/kifejezésed. A dinamikus típus pedig azt jelenti, hogy mi az az objektum valójában.
Film f = new AkcióFilm();
Jelen esetben az f statikus típusa Film, míg dinamikus típusa AkcióFilm.
Viszont ahhoz, hogy a dinamikus típussal kezdjünk valamit, lesz rögtön két operátorod és egy ún. típuskényszerítő (cast) kifejezésed.
A típuskényszerítés úgy néz ki, hogy a kifejezés elé megadod az új típust zárójelben:
Film f = new AkcióFilm();
AkcióFilm a = (AkcióFilm)f;
Ezzel annyi gond van, hogyha az f nem AkcióFilm (vagy annak egy leszármazottja), akkor ez kivételt fog dobni, amit ha nem kezelsz le, lehal az alkalmazásod.
A másik két operátor az "is" és az "as".
Az "is" így néz ki:
Film f = new AkcióFilm();
if (f is AkcióFilm) //true, ha f AkcióFilm, false ha nem
Az "as" operátor hasonló a típuskényszerítéshez, de nem fog kivételt dobni:
Film f = new AkcióFilm();
AkcióFilm a = f as AkcióFilm;
Ha az f nem AkcióFilm lenne, akkor az "a" értéke null lesz. Szóval nem is annyira muszáj is-zel megnézni, ha úgyis típuskényszeríteni akarod:
public void DoSomething() {
.. Film f = new AkcióFilm();
.. AkcióFilm a = f as AkcióFilm;
.. //A hibaellenőrzést elrejtheted, hogy átláthatóbb legyen a kódod
.. #region Error checking
.. if (a == null)
.. .. return; //Ilyen esetben ha nem tud a metódus tovább dolgozni, kiléphetsz belőle
.. #endregion
.. //csinálsz tovább mindent normálisan, tudván, hogy "a" nem null.
}
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!