Přetěžování metod (1) 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 04/11/2017
Přetěžování metod (2) Užitečné zejména v situaci, kdy je nutné pro-vádět stejnou operaci na různých datových typech Příklad: metoda WriteLine třídy Console může být použita 19 různými způsoby (je definována v 19 různých variantách) každá z nich má odlišnou sadu parametrů např.: nemá žádný parametr vypíše pouze prázdný řádek jako parametr má řetězec, který vypíše na standardní výstup jako parametr přebírá desetinné (celé) číslo a vypíše jej na stan-dardní výstup 04/11/2017
Konstanty (1) Členy třídy reprezentující konstantní hodno-ty, které se v průběhu programu nemohou měnit Jedná se o hodnoty, které musí být určitelné v době překladu programu Konstanty jsou statickými členy třídy, avšak při jejich definici se nepoužívá klíčové slovo static Lze je definovat pomocí klíčového slova const 04/11/2017
Konstanty (2) Příklad: class Physics { public const double h = 6.62606957E–34; public const double hbar = h/(2*Math.PI); public const double F = 9.6485E4; } 04/11/2017
Výčtové typy (1) Výčtové (enumerační) typy jsou uživatelem definované celočíselné typy Představují ohraničenou množinu celočísel-ných konstant Každou hodnotu výčtového typu lze převést na její celočíselný prototyp a naopak Není-li specifikováno jinak, je celočíselným prototypem typ int (System.Int32) Definice výčtového typu se provádí pomocí klíčového slova enum 04/11/2017
Výčtové typy (2) Celočíselné hodnoty výčtového typu jsou dá-ny pořadím jednotlivých identifikátorů v de-finici typu (není-li uvedeno jinak): první identifikátor má hodnotu 0 hodnoty dalších identifikátorů se zvyšují po jedné Příklad: enum Color { White, // (int)Color.White == 0 Red, // (int)Color.Red == 1 Gray, // (int)Color.Gray == 2 Blue = 5, // (int)Color.Blue == 5 Black // (int)Color.Black == 6 } 04/11/2017
Indexery (1) Členy třídy (struktury) umožňující třídě (struk-tuře) používat hranaté závorky a pracovat s ní podobně jako s polem (používat indexy) Definují se „podobně“ jako vlastnosti Název indexeru je vždy this, po němž násle-dují jeho parametry (v hranatých závorkách) Používá přístupové metody: get: pro načtení hodnoty na daném indexu (indexech) set: pro zápis hodnoty na daném indexu (indexech) zapisovaná data jsou předávána parametrem value 04/11/2017
Indexery (2) Příklad: public int this[int index] { get { … } set { … } } Poznámka: pomocí indexerů je možné s třídami a strukturami pracovat i jako s vícerozměrnými poli (přidáním dalšího argumentu do hranatých závorek): public double this[int i, int j] 04/11/2017
Pole (1) Pole představují soubor proměnných (prvků) stejného datového typu, které mohou být označovány společným jménem Zpřístupnění jednoho prvku se provádí pomo-cí indexu (indexů) zapisovaného (zapisova-ných) v hranatých závorkách Prvky pole jsou v jazyku C# vždy indexovány od nuly Pole je referenční (odkazový) datový typ K vytvoření pole určitých rozměrů se používá klíčové slovo new 04/11/2017
Pole (2) Vytvořením pole se automaticky vytváří in-stance založená na abstraktní třídě Array, která je definována ve jmenném prostoru System Mezi vlastnosti třídy Array patří např.: Length: reprezentuje celkový počet prvků (ve všech rozměrech) Rank: vrací počet rozměrů pole Počet prvků ve specifikovaném rozměru lze získat pomocí metody GetLength 04/11/2017
Pole (3) Třída Array dále poskytuje metody např. pro: kopírování polí – CopyTo vyhledávání hodnoty v poli – BinarySearch řazení prvků v poli – Sort obrácení pořadí prvků – Reverse změnu velikosti pole – Resize Třída Array rovněž implementuje rozhraní IEnumerable prvky polí lze procházet pomocí příkazu foreach 04/11/2017
Pole (4) Příkaz foreach: Jazyk C# podporuje práci s poli: umožňuje opakovat příkaz pro každý prvek v poli nebo v kolekci slouží pouze pro četní dat, nikoliv pro jejich modi-fikaci obecný tvar: foreach (typ id in pole) příkaz Jazyk C# podporuje práci s poli: jednorozměrnými vícerozměrnými (pravidelná, nepravidelná) 04/11/2017
Pole (5) Definice proměnné typu pole, vytvoření pole: jednorozměrné pole: int[] numbers; numbers = new int[10]; nebo int[] numbers = new int[10]; dvourozměrné pole (pravidelné): double[,] matrix; matrix = new double[4,5]; nebo double[,] matrix = new double[4,5]; 04/11/2017
Pole (6) dvourozměrné pole (nepravidelné – jagged array): pole polí mohou mít různou délku jednotlivých řádků int[][] jArr; jArr = new int[4][]; for (int i = 0; i < jArr.Length; i++) jArr[i] = new int[jArr.Length – i]; [0] [1] [2] [3] [0] 1 2 3 [1] 4 5 6 [2] 7 8 [3] 9 04/11/2017
Pole (7) Příklady přístupu k prvkům polí: Poznámka: numbers[1] matrix[2,3] jArr[1][2] Poznámka: pokus o zpřístupnění prvku mimo definovaný rozsah pole způsobí výjimku IndexOutOfRangeException 04/11/2017
Generické typy (1) Generické typy (generika) umožňují psát prog-ramy, které používají parametrizované typy Parametrizované typy jsou v době použití na-hrazeny typy konkrétními Vhodné v případech, kdy se stejný kód opaku-je pro různé datové typy lepší znovupouži-telnost Zabezpečují silnou typovou kontrolu v době překladu zdrojového kódu 04/11/2017
Generické typy (2) Generický typ (T) se zapisuje za název defino-vaného objektu mezi symboly <, > (<T>) V rámci jedné definice je možné použít i více parametrizovaných typů (<T1, T2, T3>) V jazyku C# lze pomocí generik definovat: třídy struktury rozhraní metody delegáty 04/11/2017
Generické typy (3) Příklad definice generické metody: static void Swap<T>(ref T p1, ref T p2) { T temp; temp = p1; p1 = p2; p2 = temp; } Příklad použití: int a = 10, b = 20; double x = 123.87; y = 15.654; Swap<int>(ref a, ref b); Swap<double>(ref x, ref y); 04/11/2017
Generické typy (4) Příklad definice generické třídy: class Stack<T> { private T[] items; private int count; public Stack(int n) {…} public void Push(T item) {…} public T Pop() {…} } Příklad použití: Stack<int> stack = new Stack<int>(10); stack.Push(3); int x = stack.Pop(); 04/11/2017
Generické typy (5) Na parametrizovaný typ mohou být kladena omezení (zapisována) pomocí klíčového slova where: where T : struct: typ T musí být hodnotový typ where T : class: typ T musí být referenční typ může se jednat o třídu, rozhraní, delegáta nebo pole where T : new(): typ T musí mít veřejný konstruktor bez parametrů je-li toto omezení použito v kombinaci s ostatními, pak musí být uvedeno jako poslední 04/11/2017
Generické typy (6) where T : class_name: typ T musí být odvozen ze specifikované třídy where T : interface_name: typ T musí implementovat dané rozhraní je možné specifikovat několik těchto omezení najednou Omezení parametrizovaných typů jsou zapiso-vána v záhlaví třídy za jejím názvem Příklad: class MyClass<T, U> where T : class, IComparable where U : struct { … } 04/11/2017
Kolekce (1) Kolekce (collection) představují standardní datové struktury (seskupení) prvků (objektů) Jsou definovány ve jmenném prostoru System.Collections a jmenných pros-torech do něj vnořených Na rozdíl od polí se jejich velikost v průběhu programu může dynamicky zvětšovat, resp. zmenšovat Některé kolekce umožňují ukládaným objek-tům přiřadit klíč, pomocí něhož lze daný objekt rychle zpřístupnit 04/11/2017
Kolekce (2) Jazyk C# rozlišuje kolekce: negenerické, obecné (non-generic): třídy, které implementují rozhraní IEnumerable ukládají data typu object po získání prvku z kolekce bývá nutné provést jeho přetypování nejsou typově bezpečné v současné době nejsou příliš používány zůstávají zachovány zejména z důvodu zpětné kompa-tibility příklady: ArrayList, Stack, SortedList , Queue 04/11/2017
Kolekce (3) generické (generic): třídy, které implementují rozhraní IEnumerable a IEnumerable<T> (IEnumerable<T> dědí od rozhraní IEnumerable) dovolují specifikovat datový typ ukládaných prvků ve chvíli vytvoření instance reprezentují silně typované (typově bezpečné) kolekce příklady: Collection<T>, List<T>, HashSet<T>, Stack<T>, Queue<T>, Dictionary<TKey, TValue> Rozhraní IEnumerable, resp. rozhraní IEnumerable<T> definují metodu GetEnumerator 04/11/2017
Kolekce (4) Metoda GetEnumerator vrací objekt Enumerator, resp. Enumerator<T> do-volující snadné procházení kolekcí pomocí příkazu foreach Použití foreach je umožněno tím, že objekt Enumerator, resp. Enumerator<T> implementuje rozhraní IEnumerator, resp. IEnumerator<T>, které definuje: object Current { get; } bool MoveNext(); void Reset(); T Current { get; } bool MoveNext(); void Reset(); 04/11/2017
Kolekce (5) Vlastnost: Metody: Current: MoveNext: Reset: slouží pro načtení prvku na aktuální pozici enumerátoru Metody: MoveNext: posune enumerátor na další prvek v kolekci Reset: nastaví enumerátor na iniciální pozici, tj, před první prvek v kolekci 04/11/2017
Třída Collection<T> Definována ve jmenném prostoru: System.Collections.ObjectModel Její instance podporují přístup k jednotlivým prvkům prostřednictvím indexu Počet ukládaných prvků není nijak limitován Není určena pro běžné použití Představuje základní třídu pro generické ko-lekce Slouží zejména jako třída pro tvorbu vlastních kolekcí 04/11/2017
Třída List<T> (1) Definována ve jmenném prostoru: System.Collections.Generic Reprezentuje silně typovaný seznam objektů, které mohou být zpřístupněny pomocí indexu Prvky jsou ukládány pomocí pole, jehož veli-kost se dynamicky zvětšuje Počet prvků v seznamu je dán hodnotou vlast-nosti Count Třída List<T> poskytuje např. metody: void Add(T item): přidá prvek item na konec seznamu – O(1), O(n) 04/11/2017
Třída List<T> (2) void Clear(): odstraní všechny prvky ze seznamu – O(n) bool Contains(T item): zjišťuje, zda se v seznamu nachází prvek item – O(n) int IndexOf(T item): hledá (lineárně) první výskyt prvku item – O(n) void Insert(int index, T item): vloží do seznamu prvek item na pozici index – O(n) bool Remove(T item): odebere ze seznamu první výskyt prvku item – O(n) void RemoveAt(int index): odebere ze seznamu prvek na pozici index – O(n) 04/11/2017
Třída List<T> (3) void Sort(): seřadí prvky seznamu (QuickSort) – O(n.log(n)), O(n2) void Reverse(): obrátí pořadí prvků v seznamu – O(n) int BinarySearch(T item): hledá v seznamu prvek item metodou půlení interva-lu – O(log(n)) prvky musí být nejprve seřazeny T[] ToArray(): kopíruje prvky seznamu do pole – O(n) Poznámka: třída List<T> představuje generický ekvivalent negenerické třídy ArrayList 04/11/2017
Třída Dictionary<TK, TV> (1) Definována ve jmenném prostoru: System.Collections.Generic Reprezentuje kolekci (slovník) klíčů a hodnot Každý klíč: je asociovaný s odpovídající hodnotou musí být jedinečný Poskytuje mapování z množiny klíčů na mno-žinu hodnot – klíče mohou být použity jako index pro zpřístupnění hodnoty Při přidávání prvků se automaticky alokuje další potřebné paměťové místo 04/11/2017
Třída Dictionary<TK, TV> (2) Implementována jako hashovací tabulka Počet dvojic klíč, hodnota je dán hodnotou vlastnosti Count Třída Dictionary<TK, TV> poskytuje např. metody: void Add(TK key, TV value): přidá dvojici klíč, hodnota do slovníku – O(1), O(n) bool ContainsKey(TK key): zjišťuje, zda slovník obsahuje klíč key – O(1) bool ContainsValue(TV value): zjišťuje, zda slovník obsahuje hodnotu value – O(n) 04/11/2017
Třída Dictionary<TK, TV> (3) void Clear(): odstraní ze slovníku všechny klíče a hodnoty – O(n) bool Remove(TK key): odebere ze slovníku hodnotu s klíčem key – O(1) bool TryGetValue (TK key, out TV value): zpřístupňuje hodnotu value se specifikovaným klíčem key – O(1) 04/11/2017
Třída HashSet<T> (1) Definována ve jmenném prostoru: System.Collections.Generic Reprezentuje množinu hodnot Umožňuje provádět množinové operace Nemohou se v ní vyskytovat duplicitní hod-noty Při přidávání prvků se automaticky alokuje další potřebné paměťové místo Počet prvků množiny je obsažen ve vlastnosti Count 04/11/2017
Třída HashSet<T> (2) Implementována pomocí hashovacího algorit-mu Třída HashSet<T> poskytuje např. metody: bool Add(T item): přidá prvek item do množiny – O(1), O(n) void Clear(): odebere všechny prvky z množiny – O(n) bool Contains(T item): zjišťuje, zda množina obsahuje prvek item – O(1) void CopyTo(T[] array): kopíruje prvky množiny do pole array – O(n) 04/11/2017
Třída HashSet<T> (3) void ExceptWith(IEnumerable<T> c): odebere z množiny prvky specifikované kolekcí c – O(n) void IntersectWith(IEnumerable<T> c): provede průnik množiny a kolekce prvků c – O(n) bool IsSubsetOf(IEnumerable<T> c): testuje, zda množina je podmnožinou kolekce c – O(n) bool IsSupersetOf(IEnumerable<T> c): testuje, zda množina je nadmnožinou kolekce c – O(n) bool Remove(T item): odebere z množiny prvek item – O(1) bool UnionWith(IEnumerable<T> c): provede sjednocení množiny a kolekce prvků c – O(n) 04/11/2017
Srovnání kolekcí Vyhledávání prvku Vložení prvku Smazání prvku List Hodnota: O(n) O(log(n)) Index: O(1) O(1), O(n) O(n) Dictionary Hodnota: O(n) Klíč: O(1) O(1), O(n) O(1) HashSet Klíč: O(1) O(1), O(n) O(1) 04/11/2017