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; Ebben az esetben, ha a gyümölcsterminőség i-es objektumát sárgarépaként hozták létre, a Carrot :: grow () kódot végrehajtják, és ha a burgonya: grow () burgonya. A programozó most nem kell fürödnie ezzel, a kívánt típusú funkció automatikusan futni fog futni.

A rendszer a legjobb választotta ezt a választ

Kapcsolódó cikkek