Principy objektově orientovaného programování

Vystavil Akhera

25.03.2010

13
Mnohé dnes nejpoužívanější programovací jazyky podporují objektově orientované programování (C++, Delphi), nebo jsou na něm přímo založené (Java, Python, ActionScript Flash). Je něco trochu jiného, než to imperativní, na které jste možná zvyklí třeba z Pascalu nebo Céčka. Co to ale vlastně je?


Tento článek předpokládá nejzákladnější znalost programování – vědět co je to proměnná a funkce.

Jak už název napovídá, v objektově orientovaném programování (dále jen OOP) se vše točí kolem objektů. V nich jsou obsažena všechna data i funkce. Jednotlivé objekty patří do tříd, které programátor nadefinuje. Třída je vlastně vzor, který definuje, jak se má objekt této třídy chovat a jaké má mít vlastnosti. Vysvětlíme si to na následujícím příkladu:

class Obdelnik {
int sirka;
int vyska;
int obsah() {
return(sirka*vyska);
}
}


Takto se definuje třída Obdelnik (mimochodem toto není vázáno na konkrétní programovací jazyk – stejným způsobem jen s drobnými úpravami je to možné ve všech jazycích, podporujících OOP). Ta má proměnné (tedy vlastnosti) výška a šířka a funkci, která vypočítá jeho obsah. Objektů (instancí této třídy) si můžeme vytvořit kolik chceme velmi jednoduchým příkazem:

Obdelnik1 = new Obdelnik();


OOP spočívá především právě ve tvoření tříd a objektů na nich založených. Takto vytvořený objekt má vlastní data – proměnné šířka a výška, které se mohou měnit. Funkce přebírá od své třídy. Příkaz na vytvoření objektu ale musí být ve funkci nějakého jiného objektu, žádná proměnná nebo funkce nesmí stát mimo objekt (vždy existuje nějaký prvotní objekt nebo funkce, aby bylo možné vytvářet další). Program, vytvořený pomocí OOP, je vlastně kolekce vzájemně komunikujících objektů. Ty si zasílají zprávy – příkazy k vykonání nějaké funkce. Funkci obsah bychom zavolali pomocí tohoto příkazu:

Obdelnik1.obsah();


To nám vrátí vynásobené proměnné šířka a výška objektu Obdelnik1.

Konstruktor


Výše uvedené proměnné ale zatím nejsou inicializované (nemají žádnou hodnotu). Buď se musí před použitím inicializovat ručně, nebo k tomu použijeme konstruktor. Vytvoření objektu je vlastně speciální funkce třídy (proto ty závorky - pro parametry). Tato funkce se nazývá konstruktor. Ke každému objektu existuje výchozí konstruktor, který pouze vytvoří objekt a jinak nic nedělá (ten jsme využili výše). Je však možné si ho nadefinovat, aby něco dělal - jako funkci, která se nazývá stejně jako třída. S konstruktorem bude vypadat třída Obdelnik takto:

class Obdelnik {
int sirka;
int vyska;
Obdelnik(x, y) {
this.sirka = x;
this.vyska = y;
}
int obsah() {
return(sirka*vyska);
}
}


Všimněte si, že konstruktor má parametry x a y. Ty se v něm předají na proměnné šířka a výška tohoto objektu (proto this). Teď už musíme vytvářet objekt třídy Obdelnik i s těmito parametry. Například tedy takto:

Obdelnik1 = new Obdelnik(6, 2);


Tento obdélník už bude mít inicializované proměnné šířka = 6 a výška = 2.

Dědičnost


Nově definovaná třída může také zdědit vlastnosti jiné třídy. Stane se tedy její podmnožinou. Například abychom využili již definovanou třídu Obdelnik, můžeme si definovat podtřídu BarevnyObdelnik:

class BarevnyObdelnik extends Obdelnik {
int cervena;
int zelena;
int modra;
}


Objekty třídy BarevnyObdelnik budou mít všechny vlastnosti (proměnné a funkce) jako objekty třídy Obdelnik, ale navíc ještě proměnné červená, zelená a modrá. Jedinou výjimkou je konstruktor, který se nepřenese.

Toto byly naprosté základy objektově orientovaného programování, které sdílejí všechny programovací jazyky, které ho podporují. Tento článek by měl sloužit jako úvod k těmto jazykům. Pokud se vám zdá nějaká jeho část nesrozumitelná, dejte mi vědět a já článek upravím.

Hodnocení +25Líbí
Přečteno 2070-krát

Komentáře

Přidat nový



Pro přispívání musíte být přihlášen


Zapsal sHTiF - 06.04.2010 18:06



Akhera ako som povedal nema zmysel to rozoberat. Co sa tyka nazoru vravim niekde to najdes tak a niekde inak. Mimo ine ja ked prednasam tak tiez hovorim o dedeni konstruktoru aj ked to nieje dedenie ako u metod. Hadat sa mozme do nekonecna ale moju jesitnost som nechal v mladosti nemam nato teda naladu :/



Zapsal Storn - 31.03.2010 16:14



Akhera:
Jeden OT, omlouvám se ti za to odřádkování, už sem to napravil :)



Zapsal Akhera - 31.03.2010 16:08



To není o názoru, konstruktor se prostě nedědí :)
Jenom to tak může vypadat, protože implicitní konstruktor podřízené třídy vypadá takhle:


public Trida () {
super();
}


Tedy že se prostě zavolá konstruktor nadřazené třídy. Ale není to že by se dědil.



Zapsal sHTiF - 30.03.2010 22:24



Inak super debata, i ked v nazore sa asi nezhodneme ;)



Zapsal sHTiF - 30.03.2010 22:20



No co sa tyka parametrov to uz je o overridovanie, co sa tyka toho druheho tak to sme asi v impasse :) Ja tvrdim ze pokial viem zavolat base class z danej metody a teda aj z konstruktoru tak to dedim, narozdiel od private ci static ktore kde sa na super odvolat nemozes, tu uz ide o to co je implicitne a co explicitne. Bezne sa stretnes s pojmom constructor inheritance ci constructor chaining kde ide prave o linkovanie funkcionalit vsetkych konstruktorov v danom inheritance strome. Navyse niektore OOP jazyky riesia aj problem s parametrami v tomto pripade.



Zapsal Akhera - 30.03.2010 18:48



To co ty tu popisuješ ale funguje jen v případě, že konstruktor nadřazené třídy nemá žádné parametry.
Navíc tohle není že by se přímo dědil, jen že se implicitně volá pokud to jde (tedy když konstruktor nadřazené třídy nemá parametry)



Zapsal sHTiF - 30.03.2010 11:11



Inak s trochou ironie si si odpovedala uz sama, super() vola konstruktor nadradenej triedy, ked mozem zavolat super() to znamena ze som to zdedil :-)


No ale uz bolo dost spamu, tesim sa na dalsie clanky ;)



Zapsal sHTiF - 30.03.2010 11:09



Akhera citala si o tom nieco ci len zo skusenosti pises? Inak si to kludne skus, sprav si triedu Objekt1 a Objekt2 ktory bude dedit Objekt1, pritom v Objekt1 konstruktore si daj debug nejaky a Objekt2 konstruktor nedefinuj vobec. A uvidis ze pri zavolani new Objekt2 sa vykonava dedeny konstruktor Objekt1. Dedi sa rovnako ako vsetky protected, public metody len pravidla pre override su ine.



Zapsal sHTiF - 30.03.2010 10:59



No ved o tom super hovorim, ked neoverridnes konstruktor tak sa vola automaticky konstruktor nadradenej triedy takze sa dedi :)



Zapsal Akhera - 27.03.2010 19:10



Tak je to trošku zjednodušené, přercejen o statických a privátních funkcích a proměnných v článku není řeč. To by musel být o dost delší. Ale konstruktor se opravdu nedědí, tím super() voláš konstruktor nadřazené třídy.



Zapsal sHTiF - 27.03.2010 12:16



Ten konec je trochu urychleny a nepravdivy, to ze dedi vsetky premmene a funkce nieje pravda napriklad staticke ci privatne premenne a funkcie nededi, tiez konstruktor sa prenasa rovnako ako ostatne metody az nato ze sa musi jeho super() metoda volat na zaciatku ak ju chceme vyuzit. Ja viem ako zaklady je to pekne, ale ten konec radsej vynehaj ;)



Zapsal bildo - 25.03.2010 15:39



Se mi malinko vratili casy :) , kdyz me kamarad(programator, spolubydlici) zacinal ucit v Delphi. Pak jsem sice i nejake hry(trosku s jeho pomoci) udelal, ale pak jsem nasel na netu Game Maker a Delphi slo pryc. Mozna celkove spatny krok, ale pro moji potrebu a tvorbu dobry. :-D .
Clanek dobry, pekne jsem zavzpominal.



Zapsal Raiper34 - 25.03.2010 14:40



Vlastne aj GM teda môžme okrajovo chápať ako objektové programovanie.




Poslední komentáře

Sousední akvárko

Nejčtenější

Nejlepší

Web Kreveta.net je unikátní sbírkou článků mapují proces tvorby her. Vedle návodů naleznete v krevetím akvárku i rozhovory s vývojáři, recenze, soutěže. Portál Kreveta.net připravují (řazeno abecedně): Akhera, Banane4joy, Bullet_catcher, Burák, Fire.js, Ikkju, Izual, Likandro, Makan, PepiCzech, StorN, Tior.
Akvárko vymaloval Tior, o chod filtrace se stará StorN (design a kód).
Copyright © 2010 Kreveta.net. Všechna práva vyhrazena.