Generické programování

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

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

Dědičnost (inheritance)

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

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

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.

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

Jazyk C# (seminář 3)

typová konverze typová inference

Základy objektové orientace I. Únor 2010

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

PREPROCESOR POKRAČOVÁNÍ

IRAE 07/08 Přednáška č. 7. Začátek (head)

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

Abstraktní třída a rozhraní

Dědění, polymorfismus

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

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

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

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

Jazyk C# (seminář 6)

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

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

Úvod do programovacích jazyků (Java)

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

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/

Principy objektově orientovaného programování

Jazyk C++ I. Šablony 2

Komponenty v.net. Obsah přednášky

Kolekce, cyklus foreach

Teoretické minimum z PJV

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

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

Seminář Java IV p.1/38

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Více o konstruktorech a destruktorech

Seminář Java II p.1/43

KTE / ZPE Informační technologie

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

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

Virtuální metody - polymorfizmus

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

Objektové programování

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

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

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

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

Java - řazení objektů

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

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

Výčtový typ strana 67

20. Projekt Domácí mediotéka

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

1. Programování proti rozhraní

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

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

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.

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

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

Abstraktní datové typy: zásobník

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

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

Jakub Čermák Microsoft Student Partner

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

Zápis programu v jazyce C#

Úvod do programování - Java. Cvičení č.4

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

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

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

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

Programovací jazyk Java

Java Enum Java, zimní semestr ,2017 1

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

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Úvod do programovacích jazyků (Java)

Mnohotvarost (polymorfizmus)

Java a XML. 10/26/09 1/7 Java a XML

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

PB161 Základy OOP. Tomáš Brukner

UJO Framework. revoluční architektura beans. verze

Jazyk C++ I. Polymorfismus

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

Programování II. Polymorfismus

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

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

Konstruktory a destruktory

Projekty pro výuku programování v jazyce Java

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Zpracoval:

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

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

Typický prvek kolekce pro české řazení

Návrhové vzory OMO, LS 2014/2015

Jazyk C# (seminář 5)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

KTE / ZPE Informační technologie

9. Polymorfismus a rozhraní

Transkript:

Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap<T>(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 = temp; static void Main(string[] args) int a = 5, b = 10; double c = 5.0, d = -88; Swap<int>(ref a, ref b); // prekladac vytvori metodu void Swap(ref int p1, ref int p2) Swap<double>(ref c, ref d); // prekladac vytvori metodu void Swap(ref double p1, ref double p2) Důvody: o znovupoužitelnost kódu o typová bezpečnost, rychlost (není třeba užívat object (boxing) lze zaměnit cokoli za cokoli!!!) Jako generické lze vytvořit: rozhraní, třídy, metody, události a delegáty Jako T může být i uživatelská třída class Trida // implementace // v Main: Trida o1 = new Trida(); Trida o2 = new Trida(); Swap<Trida>(ref o1, ref o2); Rozhraní (interface) Úvod rozhraní (interface) = způsob, jak přidat různým věcem stejnou funkčnost příklad z windows GUI: všechny programy mají stejné základní prvky a způsob ovládání (otevřít, uložit, ovládání myší ) v C# (a Java, C++ ne) = způsob, jak přidat vícenásobnou dědičnost = cca abstraktní třída se všemi členy abstraktními implicitně všechny členy public abstrakt (virtual) může obsahovat: o Metody, Vlastnosti o Delegáty, události (později) 1

o Indexem Nesmí obsahovat: proměnné, konstanty, konstruktory, destruktory, operátory. Třída může dědit od 1 třídy a od 1 a více rozhraní Příklad stroje v továrně, všechny by měly umět zastavit svou činnost (předpoklad: neexistuje společný předek pro všechny stroje): interface IZastavit void Zastavit(); class Vrtacka: IZastavit // třída implementuje rozhraní public void Vrtat() Console.WriteLine("Vrtacka.Vrtat"); public void Zastavit() // musí být definována Console.WriteLine("Vrtacka.Zastavit"); class Auto public void Jed() class Cisterna: Auto, IZastavit // vícenásobná dědičnost public void Nacerpat() Console.WriteLine("Cisterna.Nacerpat"); public void Zastavit() Console.WriteLine("Cisterna.Zastavit"); Vrtacka vrtacka = new Vrtacka(); Cisterna tanker = new Cisterna(); vrtacka.zastavit(); // přímé volání metody rozhraní - // - sice lze, ale obvykle se nedělá IZastavit zastaveni; zastaveni = (IZastavit)vrtacka; // lepší (ale nejlepší je as viz dále) zastaveni.zastavit(); // vrtačka stojí zastaveni = (IZastavit)tanker; zastaveni.zastavit(); // tanker také Rozhraní s Vlastnostmi: interface IRozhrani int Delka set; get; string Nazev get; 2

Práce s rozhraním = přetypování objektu na dané rozhraní Ručně o IZastavit zastaveni = (IZastavit)vrtacka; o Problém: implementuje třída rozhraní? Pokud ne neošetřená výjimka Operátor is = test, implementuje-li třída rozhraní (vrací true / false) IZastavit zastaveni; if (vrtacka is IZastavit) // OK, můžeme přetypovat zastaveni = (IZastavit)vrtacka; zastaveni.zastavit(); // vrtačka stojí Operátor as = is + přetypování (selže-li, vrací null, jinak odkaz na dané rozhraní) preferovaný způsob IZastavit zastaveni = vrtacka as IZastavit; if (zastaveni!= null) // pokud vrtacka implementuje IZastavit zastaveni.zastavit(); // vrtačka stojí Více rozhraní Počet rozhraní, od kterých třída dědí, není omezen interface IPrvni double Prvni(); interface IDruhe void Druha(int param); class MyClass: IPrvni, IDruhe public double Prvni() /* impl. Prvni() */ public void Druha(int param) /* impl. Druha() */ Skládání rozhraní = sdružení několika rozhraní do jednoho interface I1 void M1(); interface I2 void M2(); interface I3 : I1, I2 3

class MyClass: I3 public void M1() public void M2() Dědění rozhraní Bázová třída implementuje rozhraní Minulý příklad, jen změna odvozená jej samozřejmě zdědí (logické) class Auto: IZastavit public void Jed() public void Zastavit() Console.WriteLine("Auto.Zastavit"); class Cisterna: Auto // také obsahuje metodu Zastavit() public void Nacerpat() Console.WriteLine("Cisterna.Nacerpat"); Cisterna tanker = new Cisterna(); IZastavit zastaveni = tanker as IZastavit; if (zastaveni!= null) zastaveni.zastavit(); // vypise Auto.Zastavit Pozor: uvažme tuto situaci (nedělat!!!) o Bázová třída implementuje rozhraní s metodou Zastavit() o Odvozená třída má svoji vlastní metodu Zastavit() (ale zdědila jiné Zastavit() také od rozhraní) // třída Auto je stejná jako minule class Cisterna: Auto public void Nacerpat() Console.WriteLine("Cisterna.Nacerpat"); public new void Zastavit() // bez new varování o překrytí metod Console.WriteLine("Cisterna.Zastavit"); Cisterna tanker = new Cisterna(); tanker.zastavit(); // Cisterna.Zastavit IZastavit zastaveni = tanker as IZastavit; if (zastaveni!= null) zastaveni.zastavit(); // Auto.Zastavit 4

Explicitní implementace implementace dvou rozhraní se stejným členem = problém interface IControl void Paint(); interface ISurface void Paint(); class SampleClass : IControl, ISurface public void Paint() // ale ze ktereho rozhrani explicitní implementace = uvedení jména rozhraní při implementaci public class SampleClass : IControl, ISurface void IControl.Paint() void ISurface.Paint() o která metoda se zavolá určuje přetypování Rozhraní v BCL BCL = spoustu rozhraní; jejich implementace = využití možností BCL, např. třídění, vyhledávání Příklad rozhraní IComparable o Vyžadováno např. metodami Array.Sort(), Array.BinarySearch() o Jediná metoda int CompareTo(object obj) Porovnává aktuální instanci (její atribut) s obj Musí vracet: < 0, je-li instance < obj 0, je-li instance == obj > 0, je-li instance > obj Příklad: Třída Nadoba, bude schopna řazení podle svého objemu class Nadoba: IComparable public double objem; public Nadoba(double objem) this.objem = objem; public int CompareTo(object obj) // implementace metody rozhraní Nadoba dalsi = obj as Nadoba; if (dalsi == null) // test je velmi vhodny throw new ArgumentException("obj neni typu Nadoba"); return this.objem.compareto(dalsi.objem); // porovnavame 2 cisla typu double (double zdědilo CompareTo() // z Object 5

Nadoba[] sklenice = new Nadoba[3]; sklenice[0] = new Nadoba(10); sklenice[1] = new Nadoba(0.5); sklenice[2] = new Nadoba(5); Array.Sort(sklenice);.NET 2.0 obsahuje také generická rozhraní není nutné přetypování, rychlejší class Nadoba: IComparable<Nadoba> public double objem; public Nadoba(double objem) this.objem = objem; public int CompareTo(Nadoba other) return this.objem.compareto(other.objem); Co kdy použít Struktury proč tedy ne abstraktní třída? o Problém C# chybějící vícenásobné dědičnosti o Zdědění od třídy = zavření dveří pro další rozšiřování Cca třída, ale hodnotový typ pro zapouzdření malého počtu spolu souvisejících proměnných bod (x,y), Obdélník (x, y, š, v) nebo barva (složky RGB) Mohou obsahovat: konstruktory, metody, členské proměnné, Vlastnosti, indexery, události Nemohou obsahovat: bezparametrický konstruktor, destruktor, inicializované členské proměnné (jen přes konstruktor) Nelze aplikovat dědičnost struct Bod double x; double y; public Bod(double x, double y) this.x = x; this.y = y; Bod A = new Bod(10, 20); Umístění v paměti 6

Jako class Stack Heap Jako struct bod ref 10 20 bod 10 20 Struktury ve WinForms: 7