Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Přetěžování metod (1) Přetěžování metod – overloading:

Podobné prezentace


Prezentace na téma: "Přetěžování metod (1) Přetěžování metod – overloading:"— Transkript prezentace:

1 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

2 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

3 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

4 Konstanty (2) Příklad: class Physics { public const double h = E–34; public const double hbar = h/(2*Math.PI); public const double F = E4; } 04/11/2017

5 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

6 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

7 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

8 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

9 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

10 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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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 = ; y = ; Swap<int>(ref a, ref b); Swap<double>(ref x, ref y); 04/11/2017

19 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

20 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

21 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

22 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

23 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

24 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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

33 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

34 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

35 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

36 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

37 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


Stáhnout ppt "Přetěžování metod (1) Přetěžování metod – overloading:"

Podobné prezentace


Reklamy Google