OOP

40
22-06-24 1 OOP • OOP (O bject O riented P rogramming) – 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ře-ných) systémů • Pro umožnění objektově orientovaného návr- hu 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, ObjectPascal (Delphi)

description

OOP. OOP ( O bject O riented P rogramming) 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ře-ných) systémů - PowerPoint PPT Presentation

Transcript of OOP

Page 1: OOP

23-04-24 1

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ře-ných) systémů

• Pro umožnění objektově orientovaného návr-hu 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, ObjectPascal (Delphi)

Page 2: OOP

23-04-24 2

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ů

Page 3: OOP

23-04-24 3

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 mo-hou 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

Page 4: OOP

23-04-24 4

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)

Page 5: OOP

23-04-24 5

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)

Page 6: OOP

23-04-24 6

Datový typ třída – class (3)• Každý člen uvnitř třídy má svoji tzv. přístup-

nost (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 defi-

nován• jedná se o implicitní přístupnost k členu

Page 7: OOP

23-04-24 7

Datový typ třída – class (4)• Příklad třídy:class Ctverec{

private int strana;

public Ctverec(int pocatecniStrana){strana = pocatecniStrana;}public int UrciObsah(){ return strana*strana;}}

Page 8: OOP

23-04-24 8

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);neboCtverec c = new Ctverec(5);

Page 9: OOP

23-04-24 9

Jmenný prostor (1)• Jmenný prostor (namespace) představuje po-

jmenovaný 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 jmen-ných prostorech

Page 10: OOP

23-04-24 10

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.WriteLine(…);kde:– System – jmenný prostor– Console – třída– WriteLine – metoda

Page 11: OOP

23-04-24 11

Jmenný prostor (3)• Pomocí klíčového slova using je možné da-

ný jmenný prostor zařadit do aktuálního obo-ru platnosti

• Pro zpřístupnění identifikátoru pak není nutné uvádět označení jmenného prostoru

• Příklad:using System;

Console.WriteLine(…);

Page 12: OOP

23-04-24 12

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

Page 13: OOP

23-04-24 13

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ř. meto-du ToString, která vrací řetězec reprezen-tující současný objekt

Page 14: OOP

23-04-24 14

Předdefinované datové typy (2)Typ Popis Velikost Typový ekvivalent

sbyte celočíselný typ 8 b System.SByte

double reálný typ (s dvojitou přesností) 64 b System.Double

float reálný typ (s jednoduchou přesností) 32 b System.Single

int celočíselný typ 32 b System.Int32

long celočíselný typ 64 b System.Int64

byte celočíselný typ 8 b System.Byte

short celočíselný typ 16 b System.Int16

uint celočíselný typ 32 b System.UInt32

ushort celočíselný typ 16 b System.UInt16

ulong celočíselný typ 64 b System.UInt64

se znaménkem

bez znaménka

Page 15: OOP

23-04-24 15

Předdefinované datové typy (3)Typ Popis Velikost Typový ekvivalent

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)

decimal peněžní hodnoty (28 platných číslic) 128 b System.Decimal

char znakový typ (Unicode) 16 b System.Char

bool logický (booleovský) typ 8 b System.Boolean

object kořen objektové hierarchie System.Object

Page 16: OOP

23-04-24 16

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ů (vyj-

ma object a string) a výčtové typy– pro vytvoření vlastních hodnotových typů slouží

struktury

Page 17: OOP

23-04-24 17

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)

Page 18: OOP

23-04-24 18

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 para-

metrem 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í inicia-

lizovaný, tj. musí mít přiřazenou hodnotu

Page 19: OOP

23-04-24 19

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 para-metrem se promítají do parametru skutečného

– skutečný parametr musí být v době volání inicia-lizovaný, tj. musí mít přiřazenou hodnotu

Page 20: OOP

23-04-24 20

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 para-metrem se promítají do parametru skutečného

– skutečný parametr nemusí být v době volání ini-cializovaný, tj. nemusí mít přiřazenou hodnotu

– v průběhu metody mu musí být přiřazena hodnota

Page 21: OOP

23-04-24 21

Principy OOP• Objektově orientované programování vychá-

zí ze třech základních principů (rysů):– zapouzdření (encapsulation)– dědičnost (inheritance)– polymorfismus

Page 22: OOP

23-04-24 22

Zapouzdření• Třída může obsahovat libovolné množství

členů• Při správném objektově orientovaném přístu-pu

by však měla být data skryta (zapouzdřena) uvnitř třídy

• K jednotlivým objektům by se mělo přistupo-vat prostřednictvím metod nebo vlastností

• Toto snižuje nebezpečí vzniku chyby a umož-ňuje tvůrci modifikovat vnitřní reprezentaci třídy

Page 23: OOP

23-04-24 23

Dědičnost (1)• Jedná se o prostředek, který umožňuje dosáh-

nout snadné rozšiřitelnosti a znovupoužitel-nosti 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

Page 24: OOP

23-04-24 24

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 GetDatum() {…}public bool JePrestupnyRok() {…}

}• Na jejím základě lze definovat jejího potomka

Page 25: OOP

23-04-24 25

Dědičnost (3)• Informace o bezprostředním předkovi se zapi-

suje v definici třídy (za jejím názvem – oddě-lena dvojtečkou)

• Příklad:class DatumRoz : Datum{

public DatumRoz (byte d, byte m, ushort r) : base(d, m, r) {…}public void PrictiDen() {…}public void OdectiDen() {…}private byte DniVMesici() {…}

}

Page 26: OOP

23-04-24 26

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 kon-struktorů 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# neuve-

deme žádného předka, je jejím předkem auto-maticky třída object (System.Object)

Page 27: OOP

23-04-24 27

Dědičnost (5)• Každá definovaná třída automaticky dědí členy

definované ve třídě object (např. metodu ToString)

• Zděděné datové položky bývají obvykle inicia-lizová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 DatumRoz(byte d, byte m, ushort r) : base(d, m, r) {…}

Page 28: OOP

23-04-24 28

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);DatumRoz dRoz = new DatumRoz(2, 8, 2010);

d = dRoz;

Page 29: OOP

23-04-24 29

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

Page 30: OOP

23-04-24 30

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 úrov-ni 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

Page 31: OOP

23-04-24 31

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ěž vir-tuální a může být na úrovni dalšího potomka opět pře-definována

Page 32: OOP

23-04-24 32

Vlastnosti (1)• Členy třídy umožňující přístup k charakteris-

tický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í

Page 33: OOP

23-04-24 33

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)

Page 34: OOP

23-04-24 34

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 (skry-té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

Page 35: OOP

23-04-24 35

Vlastnosti (4)• Příklad:class Ctverec{

private int strana;public int Strana{

get { return strana;

} set {

strana = value;}

}

}

Page 36: OOP

23-04-24 36

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

Page 37: OOP

23-04-24 37

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 me-todu get a jednu přístupovou metodu set (ne-smí obsahovat žádné jiné metody, datové polož-ky nebo vlastnosti)

– přístupové metody nesmí přijímat žádné paramet-ry (zapisovaná data jsou u metody set předává-na prostřednictvím value)

– u vlastností nelze používat modifikátor const

Page 38: OOP

23-04-24 38

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; }

}

Page 39: OOP

23-04-24 39

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)

Page 40: OOP

23-04-24 40

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 -=