Miért van szükség a polimorfizmus nélkül is?
A polimorfizmus a késői kötés és az örökség mechanizmusa.
A későbbi kötés azt jelenti, hogy egy adott típusú változó kiválasztása a program működése során történik, és a programozó ezt nem határozza meg kifejezetten.
Nos, például írsz egy játékot, amelyben van kert és különféle zöldségek - sárgarépa, káposzta stb. A felhasználó ezeket a zöldségeket véletlenszerű sorrendben telepíti, nem ismeri a sorrendet a program írásakor, így nem írhat ilyet:
carrot_obj-> grow (); // kérni egy adott sárgarépát, hogy növekedjen
A helyzet megváltoztatásának és megoldásának különböző módjai vannak, de a legösszetettebbek a polimorfizmus.
A későbbi kötés végrehajtja a fajta definícióját (növényi típus) a végrehajtás szakaszában, és az összeállítás szakaszában mindenfajta zöldséget egy általánosabb típussal kell társítani. Ezért a polimorfizmus öröklés + későbbi kötődés. A leggyakoribb osztály
fel kell tüntetnie az összes zöldségünk felületét:
virtuális int grow () = 0; // módszer absztrakt növényzet növekedésére
Ez az interfész ezen a felületen keresztül történik, ha polimorfizmust használunk, hogy konkrét növényi osztályokat kezeljünk (egy adott osztály kiválasztása automatikusan megtörténik, az objektum típusától függően, amely az interfész mögött rejlik:
osztályú sárgarépát. nyilvános Gyümölcs
osztályú burgonya. nyilvános Gyümölcs
Ebben a forgatókönyvben a kertben szerepelnie kell a zöldségek listájáról (absztrakt):
míg a C ++ használata a késői kötést, meg kell használni mutatók (pointerek, vagy okos, ha nem szenvednek memóriavesztés) és a Java és a C #, például, minden automatikusan történik, mint a PIMPL idióma mindenütt jelen van (mindig okos mutatók vannak mindenütt).
Tegyük fel, hogy a felhasználó húz egy sárgarépát a kertjébe. Ez egy új sárgarépát hoz létre (valamilyen módon - példát adtam egy explicit felhívásnak a konstruktornak, de ez lehet valami olyasmi, mint a Prototype sablon), és hozzáadva a zöldségek listájához.
Gyümölcs * obj = új sárgarépa ();
Ezután a zöldségeket egy kaotikus módon hozzáadhatnák ehhez a listához, és néhány kód valamilyen gyakorisággal növekedett ezekből a zöldségekből:
(i = 0;
A rendszer a legjobb választotta ezt a választ