Transcript Prezent

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): ObjectPascal (Delphi), C++, C#, Java
13/04/2015
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ů
13/04/2015
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
13/04/2015
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)
13/04/2015
4
Datový typ třída – class (2)
–
–
–
–
–
–
–
–
–
metody (methods)
vlastnosti (properties)
události (events)
operátory (operators)
indexery (indexers)
konstruktory instance (instance constructors)
destruktory (destructors)
statické konstruktory (static constructors)
vnořené deklarace typů (nested type declarations)
13/04/2015
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
13/04/2015
6
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;
}
}
13/04/2015
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);
13/04/2015
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
13/04/2015
9
Jmenný prostor (2)
• Jmenný soubor 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
13/04/2015
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.WriteLine(…);
13/04/2015
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
13/04/2015
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 ToString, která umožňuje převést
číselnou hodnotu na její textové vyjádření
13/04/2015
13
Předdefinované datové typy (2)
Typ
Popis
Velikost
Typový ekvivalent
sbyte
celočíselný typ
8b
System.SByte
short
celočíselný typ
16 b
System.Int16
32 b
System.Int32
se znaménkem
int
celočíselný typ
long
celočíselný typ
64 b
System.Int64
byte
celočíselný typ
8b
System.Byte
ushort
celočíselný typ
16 b
System.UInt16
32 b
System.UInt32
bez znaménka
uint
celočíselný typ
ulong
celočíselný typ
64 b
System.UInt64
float
reálný typ (s jednoduchou přesností)
32 b
System.Single
double
reálný typ (s dvojitou přesností)
64 b
System.Double
13/04/2015
14
Předdefinované datové typy (3)
Typ
Popis
Velikost
Typový ekvivalent
bool
logický (booleovský) typ
8b
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)
13/04/2015
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
13/04/2015
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)
13/04/2015
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
13/04/2015
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
13/04/2015
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
13/04/2015
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
13/04/2015
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
13/04/2015
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
13/04/2015
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 GetDatum()
{…}
public bool JePrestupnyRok()
{…}
}
• Na jejím základě lze definovat jejího potomka
13/04/2015
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 DatumRoz : Datum
{
public DatumRoz
(byte d, byte m, ushort r)
: base(d, m, r) {…}
public void PrictiDen() {…}
public void OdectiDen() {…}
private byte DniVMesici() {…}
}
13/04/2015
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 destruktorů ) 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)
13/04/2015
26
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 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 DatumRoz(byte d, byte m, ushort r)
: base(d, m, r) {…}
13/04/2015
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);
DatumRoz dRoz = new DatumRoz(2, 8, 2010);
d = dRoz;
13/04/2015
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
13/04/2015
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
13/04/2015
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
13/04/2015
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í
13/04/2015
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)
13/04/2015
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
13/04/2015
34
Vlastnosti (4)
• Příklad:
class Ctverec
{
private int strana;
public int Strana
{
get {
return strana;
}
set {
strana = value;
}
}
}
13/04/2015
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
13/04/2015
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
13/04/2015
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; }
}
13/04/2015
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)
13/04/2015
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 -=
13/04/2015
40