Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.



Podobné dokumenty
1. Dědičnost a polymorfismus

Generické programování

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Základy objektové orientace I. Únor 2010

Jazyk C# (seminář 3)

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Dědění, polymorfismus

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Abstraktní třída a rozhraní

NMIN201 Objektově orientované programování 1 / :36:09

Programování v C++ 3, 3. cvičení

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

NPRG031 Programování II 1 / :25:46

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektové programování

Teoretické minimum z PJV

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Výčtový typ strana 67

Programování v C++ 1, 6. cvičení

1. Programování proti rozhraní

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Programování v C++ 2, 4. cvičení

typová konverze typová inference

Úvod do programovacích jazyků (Java)

10 Balíčky, grafické znázornění tříd, základy zapozdření

IRAE 07/08 Přednáška č. 1

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Chování konstruktorů a destruktorů při dědění

PŘETĚŽOVÁNÍ OPERÁTORŮ

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Jazyk C# (seminář 6)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

3. Třídy. Základní pojmy objektového programování. Třídy

8 Třídy, objekty, metody, předávání argumentů metod

20. Projekt Domácí mediotéka

Programování II. Dědičnost změna chování 2018/19

PB161 Základy OOP. Tomáš Brukner

9. Polymorfismus a rozhraní

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Seminář Java IV p.1/38

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Objektově orientovaný přístup

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Vyřešené teoretické otázky do OOP ( )

Dědičnost (inheritance)

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Programování II. Úvod do dědičnosti 2018/19

C# - OOP (object oriented programming)

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

PB161 Programování v jazyce C++ Přednáška 1

Návrhové vzory OMO, LS 2014/2015

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Programování II. Polymorfismus

PB přednáška (21. září 2015)

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Objektově orientované programování v jazyce Python

24. listopadu 2013, Brno Připravil: David Procházka

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Seminář Java II p.1/43

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Programování v C++ 1, 5. cvičení

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Mnohotvarost (polymorfizmus)

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Objektově orientované programování v PHP 5. Martin Klíma

Programování v Javě I. Leden 2008

UJO Framework. revoluční architektura beans. verze

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

PREPROCESOR POKRAČOVÁNÍ

KTE / ZPE Informační technologie

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Objektově orientované programování v jazyce Python

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

Objektově orientované programování. Úvod

Principy objektově orientovaného programování

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Virtuální metody - polymorfizmus

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Konstruktory a destruktory

Java Výjimky Java, zimní semestr

PB161 Programování v jazyce C++ Přednáška 3

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

11. Dědičnost. Dědičnost strana 103

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Java Enum Java, zimní semestr ,2017 1

Polymorfismus. Porovnání jazyků z hlediska polymorfismu Jazyky C, C++, C# Jazyk Java PHP a jiné Na závěr souhrn vlastností jednotlivých jazyků

Programování v Javě I. Únor 2009

Transkript:

23. Třídy, generické třídy, instance, skládání, statické metody a proměnné. Zapouzdření, konstruktory, konzistence objektu, zpřístupnění vnitřní implementace, modifikátory public a private. Polymorfismus, dědičnost, překrývání, abstraktní třídy a metody. (A7B36OMO) Třídy Třídy slouží jako "plánek" na vytváření objektů - jednotlivých instancí tříd. Třída popisuje, z jakých prvků se objekt skládá. Tyto prvky lze rozdělit na datové členy a metody, které obvykle pracují nad datovými členy daného objektu. Datové členy popisují stav objektu, zatímco metody popisují chování (state and behaviour). Instance Instance, objekty, třídní instance, třídní objekty a instance objektů popisují stejnou skutečnost. Jak název napovídá jsou to jednotlivé instance tříd. Instance vznikají zavoláním konstruktoru třídy, od které chceme instanci. Lepé tuto situaci popisuje následující přiklady. Příklad popisující vztah tříd a instancí Analogií může být následující situace. Návrhář (programátor) navrhne plánek auta - z čeho se auto skládá a co umí. Následně zavolá bandu dělníků (konstruktor), aby mu vytvořili auto podle plánku (instanci). Vytvořené auto žije již vlastním životem, pokud ho přebarvíme/změníme jeho stav, neovlivní to plánek (třídu). Výjímkou jsou statické proměnné, které jsou sdílené pro všechny instance. Příklad v C# Analogii auta se nyní pokusíme namodelovat pomocí programovacího jazyka C#. Volba programovacího jazyka není podstatná, princip je ve většině objektově orientovaných jazycích stejný. Poznámka pro rejpaly, následující program je pro pochopení značně zjednodušený. Správně by měl využít C# properties a strukturu Color. Pokud tento program spustíme, vypíše následující. car1 má barvu Red car2 má barvu Red car1 má barvu Blue car2 má barvu Red

/// Třída auta public class Car // Datové členy, obecně jich může být libovolné množství /// Datový člen, který popisuje, jakou barvu má existující auto private string m_color; /// Konstruktor public Car() // Při výrobě mají všechny auta červenou barvu m_color = "Red"; // Následují metody /// Přebarví auto /// <param name="color"></param> public void ChangeColor(string color) m_color = color; /// Metoda, která nám řekne, jakou barvu má auto. /// <returns></returns> public string GetColor() return m_color; // Vytvoříme dvě instance auta, // new Car() zavolá konstruktor a obdržíme instanci třídy Car car1 = new Car(); Car car2 = new Car(); // Vypíšeme barvu obou aut. Console.WriteLine("car1 má barvu " + car1.getcolor()); Console.WriteLine("car2 má barvu " + car2.getcolor()); // Změníme barvu jednoho auta a opět vypíšeme car1.changecolor("blue"); Console.WriteLine("car1 má barvu " + car1.getcolor()); Console.WriteLine("car2 má barvu " + car2.getcolor());

Generické třídy Generické třídy umožňují parametrizovat některý datový člen. Pokud v době psaní třídy není znám datový člen nebo ho nepotřebuju znát, můžu ho parametrizovat. Výhodou tohoto přístupu je znovupoužitelnost kódu a v případě C++ i optimalizace kódu během kompilace. Typickým příkladem jsou kolekce, které mohou udržovat jakýkoliv typ a zároveň být strongly typed (specifikovat přesně jaký typ objektu obsahují). Pro úplnost uvádím příklad, jak napsat generickou třídu v C#. V tomto příkladě odstraníme typovou závislost barvy z předchozího příkladu. Jednou ji budeme reprezentovat jako string po druhé strukturou Color. Pokud bych nepoužil generickou třídu, musel bych ji psát dvakrát. /// Třída s parametrem typu barvy (jak budeme barvu reprezentovat). /// <typeparam name="tcolor"></typeparam> class Car<TColor> private TColor m_color; public Car(TColor color) // V tomto příkladě nám někdo musí sdělit defaultní barvu, protože v době psaní // třídy ji nemůžeme určit. m_color = color; public void ChangeColor(TColor color) m_color = color; public TColor GetColor() return m_color; // barvu budeme ukládát reprezentovat stringem Car<string> car1 = new Car<string>("Red"); // barvu budeme reprezentovat strukturou Color, která je součástí C#/.NET Car<Color> car2 = new Car<Color>(Color.Red); Skládání Třídy obsahují datové členy, které jsou různých typů od int, string, float až po uživatelem definované typu. Objekty tedy mohou obsahovat jiné objekty, tomuto přístupu se říká skládání.

Statické metody a proměnné Třídy mohou mimo jiné obsahovat i statické proměnné. Tyto proměnné nepřísluší žádnému objektu a existuji pouze jedenkrát pro celou třídu. Dokonce není ani nutné vytvářet instance této třídy, pro přístup k těmto prvkům. Statické metody mají přístup pouze ke statickým proměnným a lze je volat aniž by byla vytvořená instance třídy. Většina programovacích jazyků využívá klíčového slova static před deklarací. Příklad ze kterého je vidět, že statická proměnná existuje pouze jedenkrát pro celou třídu. public class MyClass /// Statická proměnná private static int m_staticcounter; private int m_nonstaticcounter; /// Statická metoda public static void IncrementStatic() m_staticcounter++; public void IncrementNonStaticCounter() m_nonstaticcounter++; public void PrintCounters(string identifier) Console.WriteLine(identifier + " static counter: " + m_staticcounter); Console.WriteLine(identifier + " nonstatic counter: " + m_nonstaticcounter); MyClass.IncrementStatic(); MyClass c = new MyClass(); MyClass c2 = new MyClass(); c.printcounters("c"); c2.printcounters("c2"); Console.WriteLine(); c.incrementnonstaticcounter(); MyClass.IncrementStatic(); c.printcounters("c"); c2.printcounters("c2"); Výpíše c static counter: 1 c nonstatic counter: 0

c2 static counter: 1 c2 nonstatic counter: 0 c static counter: 2 c nonstatic counter: 1 c2 static counter: 2 c2 nonstatic counter: 0 Zapouzdření Zapouzdření je způsob propojení atributů a funkcí prostřednictvím objektu. Jedinou možností přístupu k atributům a funkcím objektu je vytvoření instance objektu. Zapouzdření umožňuje programátorovi umístit atributy a procedury do třídy a následně stanovat pravidla, která budou sloužit ke kontrole přístupu. Například v jednom z předchozích příkladů bychom mohli umožnit změnu barvy auta pouze při splnění nejaké podmínky. Tuto podmínku, bychom napsali do metody ChangeColor. Konstruktor Konstruktor je funkce/metoda ve třídě, která má stejný název jako třída a nevrací žádnou hodnotu (Teoreticky vrací instanci dané třídy. Tento návratový typ je ale předem znám, proto se nepíše). Používá se k inicializaci objektu. Konzistene objektu Souvisí se zapouzdřením (dobré zapouzdření napomáhá konzistenci) Přístup k objektu pouze přes dané rozhraní (metody), zbytek by měl být private Public metody měnící private proměnné musí zajistit jejich správnou úpravu tak, aby instance byla v konzistentním stavu (např. setter znemožní nastavit v určitých případech do proměnné null apod.) Lidsky řečeno, konzistence objektu znamená, že objekt by měl být stabilní za každého stavu (neměl by vyhazovat runtime exceptions) Zpřístupnění vnitřní implementace Viz konzistence objektu a zapouzdření Objekt by měl být jakási tajemná krabička, která vyjadřuje co umí přes veřejné rozhraní (veřejné rozhraní by teda mělo být psáno tak, aby byl jasný účel objektu), ale JAK toho dosahuje by mělo být skryto. Ke skrytí vnitřní implementace slouží klíčové slovo private případně protected Modifikátory public, private, protected U jednotlivých členů třídy (atributy i metody) můžeme použít modifikátory přístupu. Modifikátor je nutné aplikovat na každého člena zvlášť. Mezi typické modifikátory patří: public člen označený tímto modifikátorem je dostupný bez omezení private člen je přístupný pouze členům stejné třídy

protected přistupovat k takovému členu můžeme uvnitř vlastní třídy a ve všech zděděných třídách Poznámka: Popis těchto modifikátorů je platný pro Javu a C# apod. jazyky. V C++ je přístup ke zděděným členům zkomplikován modifikátorem dědění. Příklad ukazující modifikátory přístupu public class BaseCar public int m_weight; protected Color m_color; private int m_length; public class ExtendedCar : BaseCar public ExtendedCar() m_weight = 1200; m_color = Color.Red; // Nelze napsat //m_length = 250; BaseCar car = new BaseCar(); car.m_weight = 1300; // Nelze napsat // car.m_color = Color.Red; // car.m_length = 250; Polymorfismus Polymorfismus v programování znamená, že metody se stejnou signaturou mohou provádět mnoho různých činností. Při implementaci se využívá dědění a virtuálních metod. Příklad Výstupem je: HAFHAF MNAU

public abstract class Animal public abstract String MakeASound(); public class Dog : Animal public override string MakeASound() return "HAFHAF"; public class Cat : Animal public override string MakeASound() return "MNAU"; Animal[] animals = new Animal[] new Dog(), new Cat() ; foreach (Animal animal in animals) Console.WriteLine(animal.MakeASound()); Dědičnost Dědičnost (inheritance) je důležitou vlastností objektově orientovaného programování, protože představuje způsob, kterým jeden objekt získá atributy a chování jiného objektu. Vzniká tak hierarchie tříd, přičemž nejobecnější objekty jsou v nižších stupních hierarchie postupně upřesňovány (a tím také rozmělňovány) do mnoha konkrétnějších tříd. V jazycích Java a C# je povoleno dědit pouze od jedné třídy, zatímco C++ umožnuje dědit více tříd najednou. Zděděný typ je také možné přiřadit do proměnné typu, který je v hierarchii tříd výše. Příklady V předchozím příkladu s kočkou a psem jsme použili dědění. Na vrcholu hierarchie byl typ Animal. Typ Dog a Cat pro svoji implementaci použily dědění od třídy Animal. Ve foreach cyklu jsme jednotlivé instance tříd mohli přiřazovat do proměnné typu Animal. Poznámka: Všechny třídy v jazyce C# i Java dědí z obecného typu Object. Který je na vrcholu hierarchie všech tříd. V následujícím příkladu třídy Rectangle a Circle dědí od obecné třídy Shape. Rectangle a Circle automaticky zdědí proměnné a metody nadřazeného objektu. Metoda paint() je ve třídě Shape abstraktní, konkrétní implementace je doplněna až na úrovni obou potomků.

Překrývání (overriding) Zděděné třídy mohou překrýt chování některých metod z bázové třídy. Podmínkou je, aby metody v bázové třídě byly virtuální (Java má metody implicitně virtuální) a měly modifikátor public nebo protected. Některé jazyky pro overriding používají klíčové slovo override. S překrýváním souvisí polymorfismus. Viz příklad na polymorfismus. Poznámka: Neplést si překrývání s přetížením (overloading) - metody se stejným jménem ale jiným počtem nebo typem argumentů (signatura metody) Abstraktní třídy a metody Abstraktní metoda Metoda, která je pouze deklarována, ale nemá žádnou implementaci Implementace se typicky doplňuje až na úrovni potomka Abstraktní třída Třída, od které nelze vytvářet instance Obsahuje obvykle alespoň jednu abstraktní metodu (není podmínkou)

Abstraktní třída vs Interface C# a Java podporují také tzv. interface. Hlavní rozdíly mezi abstraktní třídou a interfacem popisuje následující tabulka. Vlastnost Interface Abstraktní třída Mnohonásobná dědičnost Třída může dědit více interfaců Třída může zdědit pouze jednu abstraktní třídu Defaultní implementace Ne Ano Třídní atributy a konstanty Ano Ne Modifikátor přistupu Všechno public Může specifikovat přístup Poznámka: V praxi se velice často interface a abstraktní třída kombinují. Navrhne se interface, abstraktní třída částečně implementuje interface, zbytek doplní pomocí abstraktních metod. Z abstraktní třídy se dále dědí a vytváří konkrétní implementace. Závěr Základem objektově orientovaného programování je dědičnost, abstrakce, polymorfismus a zapouzdření. Zdroje http://statnice.stm-wiki.cz/doku.php?id=spolecne:spol23 Jim Keogh, Mario Giannini, OOP bez předchozích znalostí Průvodce pro samouky, ISBN 80-251-0973-9