Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

Podobné dokumenty
PREPROCESOR POKRAČOVÁNÍ

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

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

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

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

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

Zápis programu v jazyce C#

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

Jazyk C# (seminář 3)

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

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

Jazyk C# (seminář 5)

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

Generické programování

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

Anotace. Objekt self, Zapouzdření, polymorfismus,

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

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

Jazyk C# (seminář 6)

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

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.

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

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

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Úvod do programovacích jazyků (Java)

typová konverze typová inference

Programování v Javě I. Únor 2009

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

Simulace. Martin Pergel

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

Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec. Programování v C# Soubory a regulární výrazy. Petr Vaněček 1 / 27

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

Programování v Javě I. Leden 2008

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

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Konstruktory a destruktory

Jazyk C++ I. Šablony 2

Objektově orientované programování

Dědění, polymorfismus

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

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

NPRG031 Programování II 1 / :47:55

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

Principy objektově orientovaného programování

URČITÝM ZPŮSOBEM PODOBNÉ

Jazyk C# a platforma.net

Teoretické minimum z PJV

1. Dědičnost a polymorfismus

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

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

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

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

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

NMIN201 Objektově orientované programování 2016/17 1 / :03:29

Tabulková data. budeme pracovat s CSV soubory položky oddělené středníkem, např.

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Jazyk C++ I. Polymorfismus

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.

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

6. PRÁCE S DATOVÝMI PROUDY

Základy objektové orientace I. Únor 2010

Abstraktní třída a rozhraní

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

Výčtový typ strana 67

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

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Jazyk C# přednáška 01. Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015

Indexové seznamy. známe už pole, kde ale musí být předem známa velikost indexové seznamy umí růst dynamicky

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

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

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

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

SOUBORY, VSTUPY A VÝSTUPY

Seminář Java II p.1/43

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

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

C# - I/O, streamy, práce se soubory

Programování v C++ VI

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

Abstraktní třídy, polymorfní struktury

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

Funkční objekty v C++.

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.

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

Jazyk C++ I. Šablony

C++ objektově orientovaná nadstavba programovacího jazyka C

Dědičnost (inheritance)

7. Datové typy v Javě

Více o konstruktorech a destruktorech

Mělká a hluboká kopie

Základy C++ I. Jan Hnilica Počítačové modelování 18

Ošetřování chyb v programech

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Mnohotvarost (polymorfizmus)

Prostory jmen. #include<iostream.h> namespace RadimuvProstor { int secti(int a, int b); class Trida { private: int Atribut; public: void metoda();

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

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

Transkript:

Poznámky k virtuálním metodám aneb co když zkoušíme překladač zlobit... Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom chtěli). Pokud neuvedeme virtual (a override ano), je z toho error (nelze overridovat nevirtuální metodu). Zapomeneme-li oboje, je z toho warning (zakrýváme metodu a není jasné, jestli je to to, co chceme). V předchozím bodě se warningu zbavíme modifikátorem new.

Čistě virtuální funkce a abstraktní třídy Co když má rodičovská třída sloužit jen jako vzor (a nechceme dělat instance a některé metody nechceme ani definovat)? Uděláme abstraktního rodiče (modifikátor abstract). Příklad: abstract class zvire... a public abstract void VydejZvuk(); Abstraktní (čistě virtuální) metoda je automaticky virtuální. Odlišnost od C++: C++ nemá modifikátor abstract a do čistě virtuální funkce se přiřadí NULL.

Příklad rodič abstract class zvire { string jmeno; public abstract void VydejZvuk(); public zvire():this("nemam!"){} public void zvire(string jmeno) { this.jmeno=jmeno;} public void KdoTam() { Console.WriteLine(jmeno);} }

Příklad syny class tygr:zvire { public tygr(string jmeno):base(jmeno){} public override void VydejZvuk() { Console.Writeline("Vrrrrrr-rrum!");} } class slepice:zvire { public slepice():base(){} //slepice jmena nemaji public override void VydejZvuk() { Console.WriteLine("Ko - ko - ko!");} }

Modifikátory přístupu public veřejné prvky, přistoupit smí každý protected přistoupit smí sama třída a potomci private (implicitní) jen já (současná třída) internal jen současné assembly (česky sestavení zatím ignorujme) protected internal současné assembly a potomci. Je zvykem nepouštět si nikoho k datům (zapouzdřenost), k nastavování a čtení se tvoří veřejné metody. Ač někdy hraničí s objektovým fanatismem, ve větších projektech je to užitečné! Metody get a set si lze nechat téměř vygenerovat:

Příklad metod get a set class zvire { private int pocetnohou; public int PocetNohou //pozor, velikost! { get { return pocetnohou;} set { if((value % 2)==0) pocetnohou=value;} } }

Použití matysek=new Tygr("Matysek"); matysek.pocetnohou=4; matysek.pocetnohou=3; System.Console.WriteLine(matysek.PocetNohou);

Zapečetěné třídy a metody Modifikátor sealed, znamená, že z třídy nelze dědit, metodu nelze overrideovat (lze jen udělat new). Příklad: sealed class bezdeti{...} Příklad: public sealed override void cilova rovinka(){...}

Struktury V jazyce C nebyly objekty, ale byly struktury, ovládaly se podobně jako recordy v Pascalu, definovaly se pomocí kĺıčového slova struct (syntakticky podobně jako třídy), V C# jsou také (ale místo nich se spíše používají objekty). Příklad: struct kompl{public int re,im;};

Pole jsou úplně snadná, ale chovají se úplně jinak než v Pascalu Typ pole definujeme operátorem hranatých závorek za jménem typu: int [] poleintu; Pole se definují předem neznámé délky a dynamicky se alokují: int[] pole=new int[10]; Pole se indexují od nuly (do délka - 1 (!)) Pole některých typů lze rovnou inicializovat: int[] pole=new int[3]{1,2,3}; anebo int[] pole=new int{1,2,3};

Pole II Pole námi definovaného typu: seznobecny[] polesez=new seznintu [10]; Toto pole se neinicializuje (je plné nullů)! polesez[0]=new seznintu(10); Délka pole atribut Length: delka=polesez.length; Při sáhnutí mimo rozsah pole vypadne IndexOutOfRangeException, Při použití neinicializovaného odkazu NullReferenceException.

Pole III Vícerozměrná pole: int [,] pole=new int[2,3]; Takové pole je obdélníkové a: pole.rank==2, pole.length==6 Nepravidelné pole (pole poĺı): int [][] pole=new int [3][]; Následně: pole[0]=new int[3]; pole[1]=new int[2];... Konstrukce foreach: int[] pole={1,2,3,4,5}; foreach (int i in pole) Console.WriteLine(i);

Řetězce Mají některé d ábelské vlastnosti Proměnné typu string, jsou to objekty, ale lze je inicializovat implicitně: string retez="kus textu!"; Porovnání na rovnost (překvapivě) porovnává obsahy (mezi jazyky rodiny C je to ale spíše výjimka). Délka (atribut Length): retez.length, Lze k němu přistupovat jako k poli, ale je read-only! Pro zápis použijte StringBuilder. Pole lze rozsekat podle oddělovačů: string[] retez.split(char[]) Příklad: string retez="1 22 3 14"; string[]cisla=retez.split({ });

Allokace poznámky Množství dostupné paměti: System.GC.GetTotalMemory(bool) Explicitní volání Garbage-collectoru: System.GC.Collect()

Namespace Namespace je jmenný prostor, syntakticky vypadá podobně jako třída, určuje území platnosti identifikátorů, lze vnořovat namespace do namespacu, nelze vnořit namespace do třídy.

Namespace II U nelokálních identifikátorů je nutno říct, ve kterém namespacu jsou, chceme-li používat identifikátory z konkrétního namespace častěji, můžeme použít using, například: using System; Příklad správně: using System; Console.WriteLine(); Příklad správně: System.Console.WriteLine(); Příklad špatně: using System.Console; WriteLine(); špatně, protože Console je statická třída, ne jmenný prostor.

Namespace III Pomocí using lze vytvářet aliasy tříd: using <alias>=<třída>; Příklad: using c = System.Console; c.writeline(); Nyní už rozumíme celému obrázku, který Visual Studio vygeneruje, až na to, že ne nutně víme, co nám jednotlivé namespacy umožňují, zájemci to ovšem mohou různými způsoby zjišt ovat.

Vstup a výstup Textový soubor Standardní vstup se řídí ze třídy Console v namespacu System. Textové soubory se ovládají velmi podobně pomocí StreamReaderu a StreamWriteru. StreamReader a StreamWriter jsou v namespacu System.IO, tedy: System.IO.StreamReader r= new System.IO.StreamReader(@"c:\temp\file.txt"); Instance třídy StreamReader resp. StreamWriter má stejný charakter jako v Pascalu proměnná typu text assignovaná ke konkrétnímu souboru. V Pascalu jsme jméno proměnné typu text předávali každé funkci, v C# voláme dotyčnému readeru (resp. writeru) metody.

Vstup a výstup II Textový soubor některé metody tříd StreamReader a StreamWriter void r.close() // zavře reader, string r.readtoend() //přečte soubor do konce, w.write(co) //vypíše do writeru, r.read() // přečte znak z readeru, r.endofstream // atribut určující konec vstupního streamu @... // pevný řetězec nefungují v něm sekvence \n,\r,...

Vstup a výstup II Příklad Zkopírování souboru System.IO.StreamReader r=new System.IO.StreamReader("soubor.txt"); System.IO.StreamWriter w=new System.IO.StreamWriter("lacina kopie.txt"); w.write(r.readtoend()); w.close();

Vstup a výstup III Příklad Zkopírování souboru po znacích System.IO.StreamReader r=new System.IO.StreamReader("soubor.txt"); System.IO.StreamWriter w=new System.IO.StreamWriter("lacina kopie.txt"); while(!r.endofstream) w.write((char)r.read()); w.close();

Poznámky Metody ReadLine(), resp. WriteLine(), kódování češtiny lze předat jako druhý parametr konstruktoru Readeru/Writeru: Příklad: Encoding e=encoding.getencoding(1250); Encoding f=encoding.getencoding(852); System.IO.StreamReader r=new System.IO.StreamReader("soubor.txt",e); System.IO.StreamWriter w=new System.IO.StreamWriter("lacina kopie.txt",f); w.write(r.readtoend()); w.close();

Konec Děkuji za pozornost...