OOP OOP Object Oriented Programming je zaloeno na
OOP • OOP (Object Oriented Programming) – je založeno na myšlence, že program provádí jisté akce nad jistými objekty, které reprezentují data – dovoluje vytváření dále rozšiřitelných (otevřených) systémů • Pro umožnění objektově orientovaného návrhu poskytují dnešní programovací jazyky (vývojová prostředí) speciální datové typy: – objektový typ (object): Turbo Pascal 5. 0 a vyšší – třída (class): C#, C++, Java, Object. Pascal (Delphi) 2021 -03 -03 1
Programovací jazyk C# • • • Vyvinutý v rámci platformy MS. NET Jedná se o objektově orientovaný jazyk Založen na jazycích C++ a Java Syntaxe C# je podobná syntaxi jazyka C Lze jej využít k tvorbě např. : – desktopových aplikací – webových aplikací, webových služeb a stránek – programů pro mobilní zařízení (PDA, mobilní telefony) – databázových programů 2021 -03 -03 2
Program v jazyce C# • Tvořen třídami a jejich členy (members) • Třídy a další datové typy jsou organizovány ve jmenných prostorech (namespace) a mohou být vnořovány do jiných tříd • Vstupním bodem každého programu v C# je metoda (funkce obsažená v typu třída) Main: – může být v programu pouze jedna – jedná se o statickou metodu – návratovým typem může být void nebo int – může přijímat parametry z příkazové řádky OS 2021 -03 -03 3
Datový typ třída – class (1) • Datový typ definovaný uživatelem • Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace • Charakterizuje vlastnosti a chování objektů • Je možné ji definovat pomocí klíčového slova class • Může obsahovat následující členy: – konstanty (constants) – datové položky (fields) 2021 -03 -03 4
Datový typ třída – class (2) – metody (methods) – konstruktory instance (instance constructors) – statické konstruktory (static constructors) – finalizery (finalizers) – vlastnosti (properties) – události (events) – indexery (indexers) – operátory (operators) – vnořené deklarace typů (nested type declarations) 2021 -03 -03 5
Datový typ třída – class (3) • Každý člen uvnitř třídy má svoji tzv. přístupnost (accessibility) určující, jakým způsobem je nebo není přístupný (viditelný) zvenčí • Nejčastěji se používá přístupnost: – public (veřejná): • přístup k danému členu není nijak omezován • člen je přístupný uvnitř i vně dané třídy – private (privátní, soukromá): • daný člen je přístupný pouze uvnitř třídy, v níž je definován • jedná se o implicitní přístupnost k členu 2021 -03 -03 6
Datový typ třída – class (4) • Příklad třídy: class Ctverec { private int strana; public Ctverec(int pocatecni. Strana) { strana = pocatecni. Strana; } public int Urci. Obsah() { return strana*strana; } } 2021 -03 -03 7
Datový typ třída – class (5) • Na základě datového typu třída lze vytvořit její instanci • Instanci typu třída označujeme jako objekt • Objekt je vytvářen pomocí klíčového slova new (způsobí vyvolání konstruktoru) • Příklad: Ctverec c; c = new Ctverec(5); nebo Ctverec c = new Ctverec(5); 2021 -03 -03 8
Jmenný prostor (1) • Jmenný prostor (namespace) představuje pojmenovaný kontejner pro další identifikátory (např. třídy) • Používán k seskupení a k rozlišení identifikátorů • Různé jmenné prostory mohou obsahovat stejné identifikátory • Dva identifikátory se stejným názvem nelze zaměnit, pokud se nacházejí v různých jmenných prostorech 2021 -03 -03 9
Jmenný prostor (2) • Jmenný prostor je možné definovat pomocí klíčového slova namespace • Každý jmenný prostor má přístup typu public • Identifikátor lze zpřístupnit pomocí označení jmenného prostoru (jmenných prostorů), např. : System. Console. Write. Line(…); kde: – System – jmenný prostor – Console – třída – Write. Line – metoda 2021 -03 -03 10
Jmenný prostor (3) • Pomocí klíčového slova using je možné daný jmenný prostor zařadit do aktuálního oboru platnosti • Pro zpřístupnění identifikátoru pak není nutné uvádět označení jmenného prostoru • Příklad: using System; Console. Write. Line(…); 2021 -03 -03 11
Přetěžování metod • Přetěžování metod – overloading: – dovoluje deklarovat více než jedenu metodu se stejným oborem platnosti a se stejným jménem – jedna metoda se tak může vyskytovat ve více variantách – přetěžované metody musí mít rozdílný seznam formálních parametrů, tj. musí se lišit počtem formálních parametrů nebo jejich typy – na základě použitých skutečných parametrů (v době volání) je rozhodnuto, která varianta bude použita 2021 -03 -03 12
Předdefinované datové typy (1) • Jazyk C# poskytuje sadu předdefinovaných datových typů, které se nachází ve jmenném prostoru System • Jednotlivé datové typy (vyjma typu string a object) jsou synonymy struktur, které obsahují metody tyto metody lze pomocí tečkové notace volat • Všechny tyto struktury poskytují např. metodu To. String, která vrací řetězec reprezentující současný objekt 2021 -03 -03 13
Předdefinované datové typy (2) Typ Popis Velikost Typový ekvivalent sbyte celočíselný typ 8 b System. SByte short celočíselný typ 16 b System. Int 16 int celočíselný typ 32 b System. Int 32 long celočíselný typ 64 b System. Int 64 byte celočíselný typ 8 b System. Byte ushort celočíselný typ 16 b System. UInt 16 uint celočíselný typ 32 b System. UInt 32 ulong celočíselný typ 64 b System. UInt 64 float reálný typ (s jednoduchou přesností) 32 b System. Single double reálný typ (s dvojitou přesností) 64 b System. Double 2021 -03 -03 se znaménkem bez znaménka 14
Předdefinované datové typy (3) Typ Popis Velikost Typový ekvivalent bool logický (booleovský) typ 8 b System. Boolean char znakový typ (Unicode) 16 b System. Char decimal peněžní hodnoty (28 platných číslic) 128 b System. Decimal object kořen objektové hierarchie System. Object string posloupnost znaků (řetězec) 16 b / znak System. String • Poznámka: – datové typy string a object jsou popsány jako třídy (nikoliv jako struktury) 2021 -03 -03 15
Hodnotové a referenční typy (1) • Každý typ v jazyce C# je přímo nebo nepřímo odvozen od třídy object • Hodnotové typy (value types): – jejich proměnné přímo nesou (obsahují) svá data – každá proměnná má svou vlastní kopii dat – změna hodnoty jedné proměnné neovlivňuje hodnotu proměnné jiné – jsou ukládány na zásobníku – patří mezi ně většina předdefinovaných typů (vyjma object a string) a výčtové typy – pro vytvoření vlastních hodnotových typů slouží struktury 2021 -03 -03 16
Hodnotové a referenční typy (2) • Referenční (odkazové) typy (reference types): – jejich proměnné ukládají odkaz (referenci) na data (objekty) – pokud dojde k přiřazení proměnné, tak dojde ke zkopírování odkazu – je možné, aby dvě proměnné obsahovaly odkaz na stejný objekt – operace nad jednou proměnnou může ovlivnit objekt, na nějž se odkazuje proměnná jiná – v paměti jsou ukládány na spravované haldě (managed heap) 2021 -03 -03 17
Předávání parametrů metodám (1) • Parametry předávané hodnotou: – deklarovány bez použití modifikátoru ref nebo out – u hodnotových typů: • dochází k předání kopie dat ze skutečného parametru do parametru formálního • změny provedené uvnitř metody nad formálním parametrem nijak neovlivňují hodnotu parametru skutečného – u referenčních typů: • dochází pouze k předání odkazu • jestliže metoda hodnotu přijatého objektu změní, pak se změna projeví i v původním objektu – skutečný parametr musí být v době volání inicializovaný, tj. musí mít přiřazenou hodnotu 2021 -03 -03 18
Předávání parametrů metodám (2) • Parametry předávané odkazem: – před formálním i skutečným parametrem musí být uveden modifikátor ref – nedochází k vytvoření nového paměťového místa pro formální parametr – formální parametr reprezentuje stejné paměťové místo, které náleží parametru skutečnému – všechny změny provedené nad formálním parametrem se promítají do parametru skutečného – skutečný parametr musí být v době volání inicializovaný, tj. musí mít přiřazenou hodnotu 2021 -03 -03 19
Předávání parametrů metodám (3) • Parametry výstupní: – před formálním i skutečným parametrem musí být uveden modifikátor out – podobné chování jako u parametrů předávaných odkazem – všechny změny provedené nad formálním parametrem se promítají do parametru skutečného – skutečný parametr nemusí být v době volání inicializovaný, tj. nemusí mít přiřazenou hodnotu – v průběhu metody mu musí být přiřazena hodnota 2021 -03 -03 20
Principy OOP • Objektově orientované programování vychází ze třech základních principů (rysů): – zapouzdření (encapsulation) – dědičnost (inheritance) – polymorfismus 2021 -03 -03 21
Zapouzdření • Třída může obsahovat libovolné množství členů • Při správném objektově orientovaném přístupu by však měla být data skryta (zapouzdřena) uvnitř třídy • K jednotlivým objektům by se mělo přistupovat prostřednictvím metod nebo vlastností • Toto snižuje nebezpečí vzniku chyby a umožňuje tvůrci modifikovat vnitřní reprezentaci třídy 2021 -03 -03 22
Dědičnost (1) • Jedná se o prostředek, který umožňuje dosáhnout snadné rozšiřitelnosti a znovupoužitelnosti již existujících částí programu • Dovoluje definovat novou třídu (B), která vznikne pouze přidáním nových členů k těm, které již byly definovány v rámci jiné třídy (A) • Třída: – A se stává bezprostředním předkem třídy B – B je bezprostředním potomkem třídy A 2021 -03 -03 23
Dědičnost (2) • Nechť je dána třída: class Datum { private byte den, mesic; private ushort rok; public Datum(byte d, byte m, ushort r) {…} public string Get. Datum() {…} public bool Je. Prestupny. Rok() {…} } • Na jejím základě lze definovat jejího potomka 2021 -03 -03 24
Dědičnost (3) • Informace o bezprostředním předkovi se zapisuje v definici třídy (za jejím názvem – oddělena dvojtečkou) • Příklad: class Datum. Roz : Datum { public Datum. Roz (byte d, byte m, ushort r) : base(d, m, r) {…} public void Pricti. Den() {…} public void Odecti. Den() {…} private byte Dni. VMesici() {…} } 2021 -03 -03 25
Dědičnost (4) • Jestliže třída B je potomkem třídy A, tak jsou třídě B automaticky dostupné všechny členy (vyjma konstruktorů instancí, statických konstruktorů a finalizerů ) třídy A, aniž by bylo nutné je znovu definovat • Říkáme, že třída B dědí členy třídy A • Jestliže při definici třídy v jazyku C# neuvedeme žádného předka, je jejím předkem automaticky třída object (System. Object) 2021 -03 -03 26
Dědičnost (5) • Každá definovaná třída automaticky dědí členy definované ve třídě object (např. metodu To. String) • Zděděné datové položky bývají obvykle inicializovány vyvoláním konstruktoru předka • Konstruktor předka se volá pomocí klíčového slova base, které je uvedeno za hlavičkou konstruktoru potomka (odděleno dvojtečkou) • Příklad: public Datum. Roz(byte d, byte m, ushort r) : base(d, m, r) {…} 2021 -03 -03 27
Dědičnost (6) • Platí, že proměnné typu třída A (předchůdce) je možné přiřadit proměnnou typu třída B (následníka) – opačné přiřazení není možné • Lze provést přiřazení tvaru: objekt předka = objekt potomka; • Příklad: Datum d = new Datum(1, 1, 2000); Datum. Roz d. Roz = new Datum. Roz(2, 8, 2010); d = d. Roz; 2021 -03 -03 28
Polymorfismus (1) • Rys umožňující, aby akce uskutečňované nad různými objekty byly pojmenovány stejně, přičemž ale jejich realizace je různá (podle toho, nad kterým objektem se provádějí) • Nástrojem pro realizaci polymorfismu jsou tzv. virtuální metody • Virtuální metody: – obsahují ve své definici klíčové slovo virtual – implementace virtuálních metod může být na úrovni potomka nahrazena implementací jinou 2021 -03 -03 29
Polymorfismus (2) – umožňují volat různé verze stejné metody na základě typu objektu určeného dynamicky za běhu programu – proces nahrazení implementace zděděné virtuální metody se označuje jako předefinování (potlačení, overriding) metody – metoda realizující odlišnou implementaci na úrovni potomka musí ve své definici obsahovat klíčové slovo override – nová implementace metody (na úrovni potomka) může volat původní implementaci téže metody (na úrovni předka) pomocí klíčového slova base, jež se zapisuje v příkazové části metody 2021 -03 -03 30
Polymorfismus (3) – poznámky: • klíčová slova virtual a override nelze použít u soukromých (privátních) metod • signatura metody, která provádí předefinování, musí být stejná (včetně návratového typu) jako signatura původní metody • metoda s klíčovým slovem override je rovněž virtuální a může být na úrovni dalšího potomka opět předefinována 2021 -03 -03 31
Vlastnosti (1) • Členy třídy umožňující přístup k charakteristickým atributům objektu nebo třídy, např. : – délka řetězce – velikost fontu – titulek okna – jméno zákazníka – apod. • Představují rozšíření datových položek: – pojmenované členy s daným datovým typem – používají stejnou syntaxi pro své zpřístupnění 2021 -03 -03 32
Vlastnosti (2) • Na rozdíl od datových položek nereprezentují paměťové místo pro uložení hodnoty • Překladač automaticky převádí zpřístupnění vlastností na volání přístupových metod • Přístupové metody specifikují příkazy, jež mají být provedeny při: – čtení hodnoty vlastnosti – změně hodnoty vlastnosti (zápisu) 2021 -03 -03 33
Vlastnosti (3) • Přístupové metody jsou zapisovány pomocí klíčových slov – get: uvozuje přístupovou metodu pro čtení – set: uvozuje přístupovou metodu pro zápis • Zapisovaná data jsou přístupovým metodám (set) předávána pomocí vestavěného (skrytého) parametru value • Konvence: – soukromé datové položky jsou psány s malým počátečním písmenem, zatímco veřejné vlastnosti s počátečním písmenem velkým 2021 -03 -03 34
Vlastnosti (4) • Příklad: class Ctverec { private int strana; public int Strana { get { return strana; } set { strana = value; } } } 2021 -03 -03 35
Vlastnosti (5) • Nechť je dána deklarace: int s; Ctverec c = new Ctverec(5); • Vlastnost Strana lze zpřístupnit: – pro čtení – např. : s = c. Strana; (volá c. Strana. get) – pro zápis – např. : c. Strana = 2*s; (volá c. Strana. set) • Vlastnost může obsahovat pouze metodu: – get: vlastnost určena jen pro čtení – set: vlastnost určena jen pro zápis 2021 -03 -03 36
Vlastnosti (6) • Omezení vlastnosti: – vlastnost nelze použít jako parametr s modifikátorem ref nebo out (za vlastností se skrývá přístupová metoda nikoliv paměťové místo) – vlastnost může obsahovat jednu přístupovou metodu get a jednu přístupovou metodu set (nesmí obsahovat žádné jiné metody, datové položky nebo vlastnosti) – přístupové metody nesmí přijímat žádné parametry (zapisovaná data jsou u metody set předávána prostřednictvím value) – u vlastností nelze používat modifikátor const 2021 -03 -03 37
Vlastnosti (7) • Jestliže metody get, resp. set provádějí pouze operace, které slouží k přečtení, resp. přiřazení do datové položky, pak je možné jejich příkazovou část vynechat • Příklad: class Ctverec { public int Strana { get; set; } } 2021 -03 -03 38
Události (1) • Členy třídy umožňující objektu nebo třídě reagovat na zprávy (události) • Program může definovat metody, které mají za úkol zpracovat příchozí zprávy, např. : – stisknutí klávesy – stisknutí tlačítka myši – pohyb myši – apod. • Metoda realizující zpracování (obsluhu) zprávy (reagující na zprávu) se označuje jako tzv. event handler (obslužná metoda) 2021 -03 -03 39
Události (2) • Parametry obslužné metody musí odpovídat definici prototypu funkce, která se nazývá delegát (delegate, zástupce) • Definice: – delegáta se provádí pomocí delegate – události pomocí klíčového slova event • Metod obsluhujících události může být více a jejich návratovým typem je typ void • Odkaz na obslužnou metodu se: – do události vkládá pomocí operátoru += – z události odebírá pomocí operátoru -= 2021 -03 -03 40
- Slides: 40