Snaha OOP (= Objektově Orientované Programování) je snaha modelovat principy reálného světa při řešení (nejlépe) jedna ku jedné. OOP vede ke zrychlení vývoje a přehlednosti programů - je možné snadno znovupoužívat již vytvořené a odladěné části.
Základem OOP je objekt, ten má atributy a metody. Objekt (= instance třídy) má typ (= třídu).
Při řešení problému jej rozložíme na nové datové typy (= třídy), specifikujeme jejich data a operace, které budou provádět a jak budou spolupracovat.
4 základní vlastnosti OOP
- abstrakce - definování společných vlastností a metod bez nepotřebných detailů, je možné vytvářet abstraktní třídy a rozhraní, které definují chování jejich potomků, abstraktní třídy nelze instanciovat přímo (protože nemají definované metody), každý z potomků pak implementuje svoji logiku sám
- zkrátka z části kódu uděláme “černou skříňku”, která poskytuje nějaké metody (ale programátor nezná jejich přesnou implementaci)
- zapouzdření - spojování dat a logiky do větších logických celků - objektů a rozhodování o přístupnosti k datům a metodám zvenčí (private, protected, public), můžeme zvenčí povolit přístup pouze k určitým metodám a vnitřní logiku nechat nedotčenou
- implementační detaily jsou schovány za množinou veřejných metod
- polymorfismus - objekty se mohou chovat jinak v závislosti na jejich kontextu, tedy pokud dědí z nějaké abstraktní třídy, která pro ně definuje abstraktní metody (které si každý objekt definuje sám, podle své logiky), tak mohu pak volat dané metody na abstraktní třídě a vykoná se logika konkrétního potomka
- method overriding a overloading
- při volání metody je implementace metody určena typem objektu a ne typem proměnné
- v ukazateli na nadtřídu se může ve skutečnosti nacházet její potomek
- skutečná metoda, která se bude volat se určí až dynamicky za běhu
- v C++ jsou to virtuální metody
- dědičnost - hierarchičnost tříd, tento princip dovoluje objektům, které dědí z nějakého jiného objektu “zdědit” jeho metody a atributy, tedy pokud jsou nějaké společné pro více objektů, tak tím dosáhneme přehlednosti, dodržím DRY principle a máme možnost měnit logiku na jednom místě
- třída může dědit z více tříd - ale ne u všech jazyků
- podtřídy mění nadtřídy či jim přidávají konkrétnější schopnosti
- metody nadtřídy mohou být překryty metodami podtříd (overwrite)
Další pojmy OOP
- skládání - objekty je možné do sebe vzájemně skládat (atributy jednoho objektu jsou také objekty)
- delegování - objekt využívá metod a služeb jiného objektu
- abstraktní metoda - má pouze deklaraci
- konkrétní definice metody je pak definovaná v potomkovi
- abstraktní třída - třída, která má min. 1 abstraktní metodu
- nemůže mít instanci, pouze její potomci, kteří už implementují konkrétní abstraktní metody
- přetížení metod (overload) - v jedné třídě je více metod stejného jména, ale s jinými parametry (jiný počet, jiné typy)
- při kompilaci se rozhodne (podle parametrů), která metoda se bude volat
- při výběru se neuvažuje návratový typ metody