OOP. Základní pojmy
OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ
Objektově orientované programování (object-oriented programming, dále OOP) je způsob programování, při kterém je na řešený problém nahlíženo z jiného hlediska, než jako tomu bylo doposud. Jde o to, že program je soustavou objektů, které spolu komunikují a ovlivňují se (narozdíl od procedurálního programování, kde je programem seznam příkazů a volání funkcí, jež je prováděn "shora dolů"). Ze všeho nejdříve jsou vytvořeny právě tyto objekty a na nich je následně program sestaven. Hlavní myšlenkou pro vznik OOP bylo, aby objekty korespondovaly s věcmi z reálného světa.
Vezměme si telefon jako příklad objektu. Voláme, přijímáme hovory, posíláme a přijímáme SMS atd. Vůbec nás nemusí zajímat nic o tom co je uvnitř a jak to funguje. Není to potřeba k tomu, abychom ho mohli používat. Používáme pouze rozhraní telefonu - tedy funkce, které nabízí (což je nějaká soustava procedur). Stručně řečeno, to, že nevíme, jak telefon funguje, není důležité, ale důležité je, že víme, jak ho používat. To je základní myšlenka OOP.
ZÁKLADNÍ POJMY
Objekt
Jak již z názvu vyplývá, objekt je základem OOP. Objekt reprezentuje jednu konkrétní věc. Každý objekt má nějaké atributy a metody. Atributy jsou vlastnosti, kterými se liší objekty též třídy - například barva a výška. Metody jsou činnosti, které mají všechny objekty dané třídy stejné.
Uveďme příklad. Z funkčního hlediska je úplně jedno, jestli používáme černou nebo bílou CD-ROM mechaniku. Černá a bílá mechanika patří do stejné třídy, ve které je definován atribut barva. Jinak fungují úplně stejně.
Třída
Třída je šablonou pro objekty se stejnými metodami. Podobné objekty (lišící se jen v atributech) jsou definovány právě podle této šablony. Jsou zde definovány činnosti, které mohou objekty provádět.
Abstraktní třída
Jedná se o speciální třídu, která má definováno rozhraní reprezentované atributy a metodami, které vlastně povětšinou neprovádější žádnou činnost ani neuchovávají nějaká data a nebo to naopak dělají, aby byly společným základem pro odvozené dceřiné třídy. To proto, že z abstraktní třídy není možné vytvořit konkrétní instanci (objekt). Chceme-li mít možnost nějakou instanci vytvořit, je nutné nejprve vytvořit novou třídu, která bude mít třídu abstraktní za svého rodiče, čímž zdědí všechny její atributy, metody a události. Tyto je pak povětšinou třeba v dceřiné třídě přepsat tak, aby získali konkrétní náplň a význam.
Instance třídy
Každý objekt spadá pod nějakou třídu. V této třídě je příslušný objekt instancí. Pokud máme třídu CD-ROM mechanik, jejími instancemi budou mechanika1, mechanika2, mechanika3, ... Mechanika1 bude například černá a bude číst rychlostí 40x. Všechny CD-ROM mechaniky (ta moje, ta vaše i všechny ostatní) jsou instancemi třídy CD-ROM mechanika. Všechny poskytují stejné služby (čtení CD, vysunutí apod.) a liší se v atributech - tedy záležitosti jako je barva, rychlost čtení apod.
Metoda
Metoda je podprogram, který se vztahuje pouze k určité třídě a může tak být volána pouze pro instance této třídy. Třída CD-ROM mechanik asi bude těžko obsahovat metodu nakresli_elipsu. Tuto metodu budou ale obsahovat třídy pro návrh grafických aplikací.
Zpráva
Zpráva je prostředek komunikace objektu s okolím. Například pro vysunutí CD z mechaniky stiskneme tlačítko na mechanice. Tím vyvoláme metodu a mechanice předáme zprávu, kterou oznamujeme, že má vysunout CD. Podmínkou toho je, aby mechanika tlačítko pro vysunutí měla - musí existovat příslušná metoda.
Rozhraní objektu
Rozhraní (často interface) objektu je množina zpráv, kterým objekt rozumí. Uživatele objektu zajímá právě jen rozhraní.
ZÁKLADNÍ 3 VLASTNOSTI OOP
ZAPOUZDŘENOST (OBALENÍ)
Zapouzdřenost (obalení) je realizováno novým datovým typem - objekt, který vzniknul kombinací standardního datového typu záznam (record), procedur a funkcí. Obsahuje tedy kromě datových položek (atributů) také řídící struktury - metody. Oním obalením tedy mužeme rozumět obalení datových položek (atributů) řídícími strukturami - metodami, které zajišťují přístup k datovým položkám. Dobrý programátor by měl připravit dostatečný počet metod, aby uživatel neměl potřebu přímo přistupovat k datovým položkám.
type | |
MujNovyObjekt = object | |
X, Y, Z : integer; | - datová položka (atribut) |
Velikost : real; | - datová položka (atribut) |
procedure Init(Xi, Yi, Zi : integer); | - metoda |
procedure ZjistiPozici; | - metoda |
function ZjistiVelikost; | - metoda |
end; |
Metody, které jsme použili v definici objektu, zde uvádějí pouze své hlavičky. Jejich deklarace následuje až za definicí objektu. V této deklaraci je kromě identifikátoru metody uveden ještě identifikátor objektu, který je oddělen od identifikátoru metody tečkou. Ukážeme si to na deklaraci metody Init, která má svou hlavičku v předchozí definici objektu MujNovyObjekt.
procedure MujNovyObjekt.Init(Xi, Yi, Zi : integer); |
begin |
X := Xi; |
Y := Yi; |
Z := Zi; |
end; |
V těle metody jsou všechny datové položky objektu přímo přístupné bez předpony jména objektu. Chceme tím říci to, že použitím identifikátoru MujNovyObjekt v hlavičce metody jasně víme, kterého objektu jsou dané datové položky (atributy).
DĚDIČNOST
Při vytváření nové - odvozené nebo chcete-li dceřiné - třídy vezmeme kteroukoli již existující třídu, označíme ji za rodičovskou třídu, čímž zdědíme všechny její vlastnosti, metody i události a doplníme do ní jen rozdíly. Každá třída objektů pak zná nejen své vlastnosti, metody a události, ale pamatuje si i svoji třídu rodičovskou. V praxi to pak znamená, že pokud objekt (instance) nějaké třídy přijme nějakou zprávu, vyhledá k ní odpovídající metodu ve své třídě a tu provede. Pokud však takovou metodu nezná, předá tuto zprávu své rodičovské třídě, kde probíhá stejný pokus o vyhledání příslušné metody nebo pokus o předání zprávy dále další rodičovské třídě. Tento mechanismus probíhá v hierarchii objektových tříd dále, dokud není příslušná metoda vyhledána nebo již neexistuje rodičovská třída. Obdobně je tomu u vlastností objektů a nejinak i u událostí.
type Lokace = object |
X : integer; |
Y : integer; |
end; |
Bod = object(Lokace) |
Stav : boolean; |
end; |
Kruh = object(Bod) |
Polomer : integer; |
Barva : word; |
procedure Init(Xi, Yi, Polomer : integer); |
procedure Zobraz; |
procedure Smaz; |
end; |
atd. Celou hierarchii dědičnosti si můžeme ukázat pomocí diagramu:/font>>/>>/>>/>>/>>/>>/>>/>/font>>/>>/>>/>>/>>/>>/>>/>
Jeden objekt - předek může mít mnoho potomků, avšak jeden potomek může mít pouze jednoho předka.
POLYMORFISMUS (MNOHOTVAROST)
Polymorfismus (mnohotvarost) je úzce spjat s předchozí vlastností OOP, a to s dědičností.
Polymorfismus je vlastnost OOP, která umožňuje pojmenovat metodu jedním jménem a tato metoda může být společná pro různé objekty ve stromové hierarchii, i když pro každý objekt v této hierarchii se bude chovat různě. Jinak řečeno: polymorfismus umožňuje, aby každý objekt ve stromové hierarchii objektů (viz obrázek výše) volal metodu se stejným jménem. Přitom může mít každý objekt tuto metodu jinak definovanou. Výsledkem je, že pro každý objekt ve stromové hierarchii bude mít volání metody jinou odezvu, avšak pro každý objekt vždy tu správnou.
Práce s objekty v programu je stejná jako s datovým typem záznam (record). To znamená, že pokud budeme přistupovat k datovým položkám či k metodám objektu, použijeme tečkovou konvenci nebo příkazu with.
Další podrobné informace týkající se využívání statických a virtuálních metod, dynamických objektů (pojmy: konstruktor, destruktor) či nezpřístupnění jednotlivých metod nebo atributů uživateli v rámci instance se dočtete na této výborně zpracované stránce o OOP.
Citace:
- http://www.sweb.cz/david.padrta/pascal/7oop.html
- http://www.wikipedia.org/
- http://casopis.programator.cz/r-art.php?clanek=198
- http://bredy.jinak.cz/?g=clanek&c=46