Principy OOP - rozhraní, dědičnost PB161

Rozměr: px
Začít zobrazení ze stránky:

Download "Principy OOP - rozhraní, dědičnost PB161"

Transkript

1 Principy OOP - rozhraní, dědičnost 1 Principy OOP - Dědičnost, rozhraní

2 Co nás dnes čeká Motivace pro a realizace rozhraní Dědičnost a kompozice Operátor reference & 2 Principy OOP - Dědičnost, rozhraní

3 Rozhraní 3 Principy OOP - Dědičnost, rozhraní

4 Motivace pro rozhraní Může Microsoft/Torvalds vyvinout operační systém bez znalosti konkrétního hardware na kterém bude provozován? Tiskárny Harddisk CPU Grafická karta 4 Principy OOP - Dědičnost, rozhraní

5 Motivace pro rozhraní 5 Principy OOP - Dědičnost, rozhraní

6 Principy OOP - Dědičnost, rozhraní

7 Existující kód int main() { IPrinter* printer = GetSelectedPrinter(); printer->printdocument(); printer->getpendingdocuments(); } return 0; Nový kód IPrinter* GetSelectedPrinter() { // user selects printer via GUI // e.g., InkPrinter -> selectedprinter // e.g., LaserPrinter -> selectedprinter return selectedprinter; } 7 Principy OOP - Dědičnost, rozhraní

8 Rozhraní a implementace 1. Deklarace rozhraní (abstraktní třída, obecná tiskárna) Virtuální metody (virtual) Virtuální destruktor 2. Implementace konkrétní třídy (konkrétní tiskárna) Dědičnost Implementace metod rozhraní (obecné tiskárny) 3. Použití konkrétní instance (konkrétní tiskárna) Vytvoření instance konkrétní třídy, dynamická alokace Přetypování potomka na předka (rozhraní) Použití konkrétní tiskárny skrze rozhraní (obecná tiskárna) 4. Zrušení instance (konkrétní tiskárna) Hodí se nám virtuální destruktor 8 Principy OOP - Dědičnost, rozhraní

9 1. Deklarace rozhraní Jméno rozhraní (velké I před jménem je pouze konvence) Klíčové slovo virtual umožní potomkům poskytnout vlastní implementaci metod rozhraní. class IPrinter { public: virtual string GetPendingDocuments() const = 0; virtual void PrintDocument(const string& document) = 0; virtual ~IPrinter() {} }; Rozhraní by mělo vždy poskytovat virtuální destruktor tak, aby potomci mohli implementovat vlastní úklid, pokud potřebují. Prázdná implementace {} je poskytnuta proto, aby potomek nebyl nucen destruktor implementovat, pokud to nepotřebuje. Principy OOP - Dědičnost, rozhraní = 0 označuje deklaraci funkce, u které nebude poskytnuta implementace. Implementaci poskytují potomci.

10 2. Implementace konkrétní třídy class CHPDeskJet5550 : public IPrinter { string m_printeddocument; public: CHPDeskJet5550() {} Konkrétní třída CHPDeskJet5550 dědí z rozhraní IPrinter (tzv. implementuje rozhraní). V případě metod rozhraní = 0 musí poskytnout implementaci, jinak nelze tvořit instance. }; virtual string GetPendingDocuments() const { return m_printeddocument; } virtual void PrintDocument(const string& document) { m_printeddocument = document; } ~CHPDeskJet5550() { cout << "~CHPDeskJet5550() called"; } Konkrétní implementace metod z rozhraní (předka) Třída může poskytnout vlastní destruktor s vlastním úklidem Principy OOP - Dědičnost, rozhraní

11 3. Použití konkrétní instance // HPDeskJet5550 printer, allocation on stack CHPDeskJet5550 printer1; printer1.printdocument("secret"); // Create new HPDeskJet5550 printer, dynamic allocation on heap CHPDeskJet5550* printer2 = new CHPDeskJet5550(); printer2->printdocument("secret"); Vytvoření proměnné printer1 typu CHPDeskJet5550 na zásobníku a její použití Dynamická alokace proměnné printer2 na haldě // Create new HPDeskJet5550 printer, retype to base class (interface) IPrinter* printer3 = new CHPDeskJet5550(); Přetypování dynamicky printer3->printdocument("secret"); alokovaného objektu typu cout << printer3->getpendingdocuments() << endl; CHPDeskJet5550 na typ předka - rozhraní // printer1 is automatically removed when function ends // dealloaction of instance CHPDeskJet5550 // destructor CHPDeskJet5550::~CHPDeskJet5550 is called delete printer2; // destructor CHPDeskJet5550::~CHPDeskJet5550 is called, // because IPrinter::~IPrinter is virtual destructor delete printer3; Použití objektu konkrétní tiskárny jen prostřednictvím rozhraní Principy OOP - Dědičnost, rozhraní

12 4. Zrušení instance // HPDeskJet5550 printer, allocation on stack CHPDeskJet5550 printer1; printer1.printdocument("secret"); // Create new HPDeskJet5550 printer, dynamic allocation on heap CHPDeskJet5550* printer2 = new CHPDeskJet5550(); printer2->printdocument("secret"); // Create new HPDeskJet5550 printer, retype to base class (interface) IPrinter* printer3 = new CHPDeskJet5550(); Objekt printer1 na printer3->printdocument("secret"); zásobníku se zruší cout << printer->getpendingdocuments() << endl; automaticky při konci funkce // printer1 is automatically removed when function ends // dealloaction of instance CHPDeskJet5550 // destructor CHPDeskJet5550::~CHPDeskJet5550 is called delete printer2; // destructor CHPDeskJet5550::~CHPDeskJet5550 is called, // because IPrinter::~IPrinter is virtual destructor delete printer3; Principy OOP - Dědičnost, rozhraní Dealokace dynamicky alokovaných objektů z haldy Objekt printer3 je typu IPrinter, díky virtuálnímu destruktoru se zavolá i destruktor třídy CHPDeskJet5550

13 Rozhraní a implementace (rekap.) 1. Deklarace rozhraní (abstraktní třída, obecná tiskárna) Virtuální, čistě abstraktní metody 2. Implementace konkrétní třídy (konkrétní tiskárna) Dědičnost, Polymorfismus, Zapouzdření Implementace metod rozhraní (obecné tiskárny) 3. Použití konkrétní instance (konkrétní tiskárna) Přetypování potomka na předka (rozhraní) Použití konkrétní tiskárny prostřednictvím rozhraní Zapouzdření 4. Zrušení instance (konkrétní tiskárna) delete, virtuální destruktor 13 Principy OOP - Dědičnost, rozhraní

14 Dědičnost 14 Principy OOP - Dědičnost, rozhraní

15 Dědičnost v OOP Dědičnost je nástroj pro podporu abstrakce potomci dodržují rozhraní zavedené předkem mohou ale měnit chování (implementaci) můžeme mít generický kód, který bude pracovat s budoucími implementacemi Dědičnost je nástroj pro omezení duplicity v kódu Duplicita v kódu je nepříjemná snižuje přehlednost zvyšuje náročnost úprav (nutno na více místech) zvyšuje riziko chyby (někde zapomeneme upravit) dědit z třídy jen pro využití části funkčnosti ale není dobré (viz. dále) Zlepšuje možnost znovuvyužití existujícího kódu 15 Principy OOP - Dědičnost, rozhraní

16 Dědičnost v C V C se abstrakce a znovuvyužití kódu dosahuje: dobrým návrhem funkčního rozhraní umístěním do samostatných hlavičkových souborů přechod na jinou implementaci ideálně jen změnou hlavičkového souboru V C se duplicita kódu odstraňuje: vytvořením nové funkce a vložením funkčního volání na původní místa 16 Principy OOP - Dědičnost, rozhraní

17 Dědičnost v C++ V C++ existuje systematičtější podpora lze odstranit duplicitu i pro proměnné navíc podporuje silnou typovou kontrolu Mechanismus umožňující vytvořit další třídu (potomek) s využitím předlohové třídy (předek) potomek zdědí možnosti předka (atributy a metody) může je rozšiřovat a předefinovat (překrývat) 17 Principy OOP - Dědičnost, rozhraní

18 Dědičnost postup při abstrakci Máme dvě (nebo víc) entit se společným chováním Snažíme se vytvořit společnou logiku (metody), které budou potřebné chování pro všechny entity popisovat aniž bychom museli vědět, se kterou právě pracujeme tvoříme rozhraní Vytvoříme novou třídu (předka, rozhraní) obsahující popis společného rozhraní (veřejné metody) Pro jednotlivé entity vytvoříme nové samostatné třídy, které budou implementovat definované rozhraní Nové třídy budou potomci třídy definující rozhraní 18 Principy OOP - Dědičnost, rozhraní

19 Dědičnost - syntaxe #include "cmousebase.h" Potomek Hlavičkový soubor předka class CFieldMouse : public CMouseBase { public: Předek CFieldMouse(); protected: bool increasesizebyfood(const unsigned int foodamount); }; Modifikátor definující způsob dědění metod a atributů 19 Principy OOP - Dědičnost, rozhraní

20 Přístupová práva - protected K položce s právem protected má přístup pouze potomek atribut může být čten a měněn potomkem metoda nemůže být volána zvenčí Jako protected typicky označujeme metody které nemají být dostupné všem, ale potomkům ano často jde o virtuální přetěžované metody (později) méně často atributy raději protected setter metodu 20 Principy OOP - Dědičnost, rozhraní

21 Typová hierarchie Dědičnost vytváří hierarchii objektů od nejobecnějšího k nejspecifičtějším Na místo předka může být umístěn potomek proměnná s typem předka může obsahovat potomka potomek může být argumentem funkce s typem předka zároveň zachována typová bezpečnost Při dědění lze omezit viditelnost položek předka specifikace práv při dědění 21 Principy OOP - Dědičnost, rozhraní

22 Specifikátory přístupových práv dědění public (class B : public A {}; ) zděděné položky dědí přístupová práva od předka práva zůstanou jako předtím private (class B : private A {}; ) zděděné položky budou private, odvozená třída však bude mít přístup ke položkám, pokud byly v předkovi public nebo protected nebude přístup k položkám private u předka v potomcích potomka už nebude přístup používáme, pokud nechceme být předkem 22 Principy OOP - Dědičnost, rozhraní

23 Specifikátory dědění přístupových práv (2) protected (class B : protected A {}; ) položky private a protected zůstanou stejné, z public se stane protected pokud neuvedeme (class B : A {}; ) class jako private, u struct a union jako public virtual (class B : virtual A {}; ) lze kombinovat s jedním z předchozích, přikazuje pozdní vazbu (viz později) 23 Principy OOP - Dědičnost, rozhraní

24 Práva při dědění - ukázka inheritancerightsdemo.cpp přístup k private metodě přístup při dědění public/private/protected změna práv pro přístup při opakovaném dědění způsob znepřístupnění původně public metody 24 Principy OOP - Dědičnost, rozhraní

25 kód z inheritancerightsdemo.cpp // // Inheritance rights demo // class A { private: void privatemethoda() {} protected: void protectedmethoda() {} public: void publicmethoda() {} }; /** Public inheritance - all rights for inherited methods/atributes stay same */ class B : public A { public: void test() { //privatemethoda(); // error: 'void A::privateMethodA()' is private protectedmethoda(); // OK publicmethoda(); // OK } }; /** Private inheritance - all rights for inherited methods/atributes changes to private */ class C : private A { public: void test() { //privatemethoda(); // error: 'void A::privateMethodA()' is private protectedmethoda(); // OK, but protectedmethoda is now private in C publicmethoda(); // OK, but publicmethoda is now private in C } }; Principy OOP - Dědičnost, rozhraní

26 kód z inheritancerightsdemo.cpp (2) /** Public inheritance from C (C was inherited privately from A) } */ }; class D : public C { public: void test() { //privatemethoda(); // error: 'void A::privateMethodA()' is private //protectedmethoda(); // error: 'void A::protectedMethodA()' is protected //publicmethoda(); // error: 'void A::publicMethodA()' is inaccessible } }; class C : private A { public: void test() { //privatemethoda(); protectedmethoda(); publicmethoda(); /** Protected inheritance - all rights for inherited methods/atributes changes to private */ class E : protected A { public: void test() { //privatemethoda(); // error: 'void A::privateMethodA()' is private protectedmethoda(); // OK, protectedmethoda stays protected in E publicmethoda(); // OK, but publicmethoda is now protected in E } }; /** Public inheritance from E (E was inherited as protected from A) */ class F : public E { public: void test() { //privatemethoda(); // error: 'void A::privateMethodA()' is private }; } protectedmethoda(); // OK publicmethoda(); // OK 26 Principy OOP - Dědičnost, rozhraní

27 Jak dědit z více existujících tříd? Nová třída má mít vlastnosti více entit Novou třídu lze přetypovat na více různých předků v Jave se řeší pomocí interfaces V C++ lze řešit pomocí násobné dědičnosti (třída má více předků) pomocí kompozice objektu (třída má více podčástí) 27 Principy OOP - Dědičnost, rozhraní

28 Syntaxe násobné dědičnosti class CRAMMemory { int m_ramsize; Předek 1 public: CRAMMemory(unsigned int size) { m_ramsize = size; } int getramsize() const { return m_ramsize; } }; Předek 2 class CCPU { int m_clockfrequency; public: CCPU(unsigned int freq) { m_clockfrequency = freq; } int getcpufreq() const { return m_clockfrequency; } }; Dědíme z obou předků class CNotebookInherit : public CRAMMemory, public CCPU { public: CNotebookInherit(unsigned int ramsize, unsigned int cpufreq) : CRAMMemory(ramSize), CCPU(cpuFreq) { this-> CCPU::getCPUFreq(); } int getcpufreq() const { return m_clockfrequency; } }; Syntakticky správně, je ale vhodné? Principy OOP - Dědičnost, rozhraní

29 Dědičnost vs. kompozice Dědičnost je Is-A vztah (chová se je jako A) potomek má všechny vnější vlastnosti předka A potomka můžeme přetypovat na předka (je správné se na notebook dívat jako na případ CPU?) Kompozice je Has-A vztah třída může mít jako atribut další třídu A hodnotou, referencí, ukazatelem třída obsahuje vlastnosti A a další třída může mít víc tříd jako své atributy (je vhodnější se na notebook dívat jako na složeninu CPU a RAM?) 29 Principy OOP - Dědičnost, rozhraní

30 Kompozice namísto násobné dědičnosti class CNotebookInherit : public CRAMMemory, public CCPU { }; Násobná dědičnost Kompozice class CNotebookComposition { CRAMMemory m_ram; CCPU m_cpu; public: /** Initialize atributes in constructor. As params are passed into constructors of attributes, inicialization list section needs to be used */ CNotebookComposition(unsigned int ramsize, unsigned int cpufreq) : m_ram(ramsize), m_cpu(cpufreq) {} int getcpufreq() const { return m_cpu.getcpufreq(); } int getramsize() const { return m_ram.getramsize(); } }; 30 Principy OOP - Dědičnost, rozhraní

31 Dědičnost vs. kompozice - ukázka inheritancecompositiondemo.cpp násobná dědičnost kompozice využití inicializační sekce konstruktoru přetypování na předka 31 Principy OOP - Dědičnost, rozhraní

32 Dědičnost vhodnost použití Dle použití lze volit mezi dědičností a kompozicí Obecně preference kompozice před dědičností násobná dědičnost může být nepřirozená ale kompozice může být kódově rozsáhlejší Možná i kombinace objekt obsahuje kompozicí třídy jako atributy jednotlivé atributy mohou mít hierarchii dědičnosti 32 Principy OOP - Dědičnost, rozhraní

33 Existující kód int main() { IPrinter* printer = GetSelectedPrinter(); printer->printdocument(); printer->getpendingdocuments(); } return 0; Nový kód IPrinter* GetSelectedPrinter() { // user selects printer via GUI // e.g., InkPrinter -> selectedprinter // e.g., LaserPrinter -> selectedprinter return selectedprinter; } 33 Principy OOP - Dědičnost, rozhraní

34 Dědičnost správné použití (1) Z nového kódu můžeme vždy volat kód existující aniž bychom přepisovali existující kód (víme jméno a parametry existující funkce, nový kód přizpůsobíme) Dědičnost nám umožňuje volat z existujícího kódu kód, který teprve bude napsán existující kód pracuje s předkem (např. IPrinter) (IPrinter deklarován v době psaní existujícího kódu) nový kód vytváří potomky (např. CInkPrinter) existující kód pracuje s IPrinter CInkPrinter lze přetypovat na IPrinter existující kód může používat CInkPrinter (jako IPrinter) Potomek by neměl měnit logiku chování (rozhraní) předka! CInkPrinter pořád přijímá dokument na tisk pouze tiskne specializovaným způsobem 34 Principy OOP - Dědičnost, rozhraní

35 Multifunkční zařízení (tiskárna + scanner) Řešení pomocí dědičnosti Řešení pomocí kompozice 35 Principy OOP - Dědičnost, rozhraní

36 Multifunkční zařízení (2) Je lepší použít dědičnost nebo kompozici? Pokud se jednotlivý předkové funkčně nepřekrývají, tak lze vícenásobná dědičnost vhodné je dědit z čistě abstraktních tříd (viz. dále) pak je stejné jako rozhraní v Javě (interfaces) IPrinter a IScanner pokrývají odlišnou funkčnost Dědičnost používáme, pokud předpokládáme přetypování potomka na předka u CInkPrinter bude nastávat bude nastávat i u CScanPrintDev? Dědičnost používáme, pokud předpokládáme později vznik potomků z naší třídy 36 Principy OOP - Dědičnost, rozhraní

37 Dědičnost správné použití (2) Dědičnost je velice silný vztah => jeho nevhodné použití může přinést problémy Potomci při dědičnosti mají specializovat, ne rozšiřovat funkčnost základního objektu CStudentTeacher není jen speciální případ studenta CStudentTeacher je student a učitel zároveň => víc než jen student => dědičnost není vhodná vhodnější je zde kompozice (CStudentTeacher obsahuje atributy CStudent a CTeacher) Platí že potomek je substituovatelný za předka? pokud ano, použijte dědičnost Preferujte kompozici před dědičností 37 Principy OOP - Dědičnost, rozhraní

38 Dědičnost postup při duplicitě Máme dvě (nebo víc) tříd se společným chováním Identifikujeme společnou logiku (metody) Identifikujeme společná data (atributy) Vytvoříme novou třídu (předka) obsahující společné atributy a logiku Odstraníme přesunuté atributy&metody z původních tříd Původní třídy nastavíme jako potomky nového předka 38 Principy OOP - Dědičnost, rozhraní

39 Dědičnost - příklad V laboratoři máme domácí a polní myš. Rozdíl mezi druhy je jen v počáteční velikosti a rychlosti přibírání po požití potravy. Nové třídy CHouseMouse a CFieldMouse Společné vlastnosti přesunuty do CMouseBase CHouseMouse a CFieldMouse potomci CMouseBase 39 Principy OOP - Dědičnost, rozhraní

40 Přetypování private/protected potomka Lze získat přístup k public metodám předka z instance potomka, který dědil pomocí private/protected pomocí jeho přetypování na předka? nelze, viz. brokenrightsdemo.cpp itance-a-is-an-inaccessible-base-of-b 40 Principy OOP - Dědičnost, rozhraní

41 Přetypování private/protected potomka (2) class A { public: void foo() { cout << "foo called" << endl; } }; class B : protected A { }; int main() { A a; a.foo(); B b; //b.foo(); // error: 'void A::foo()' is inaccessible } // Let's try to retype B to A to get access to originally public method A& refb = b; // error: 'A' is an inaccessible base of 'B' refb.foo(); 41 Principy OOP - Dědičnost, rozhraní

42 Dědičnost a virtuální dědičnost Problém typu diamand vzniká typicky při nevhodné OO hierarchii Virtuální dědičnost umožňuje obejít, ale MNOHEM vhodnější je přímo odstranit problém změnou hierarchie (pokud je možné) CPerson CStudent CTeacher CTeachStudent 42 Principy OOP - Dědičnost, rozhraní

43 Abstraktní třída 43 Principy OOP - Dědičnost, rozhraní

44 Generalizace Cílem je navržení takového rozhraní, které pod sebe schová chování více typů objektů Hledají se společné vlastnosti různých objektů Např. iterátor na procházení pole není podstatné, že jde o int[] nebo float[] pole Např. zobrazení objektů na cílovou plochu není podstatné, jaká přesně bude (obrazovka, tiskárna) Např. tiskárny není podstatná technologie tisku Principy OOP - Dědičnost, rozhraní Principy OOP - Dědičnost, rozhraní

45 Motivace pro rozhraní Chceme podchytit, co všechno musí splňovat třída, aby se mohla vydávat za příslušníka dané skupiny např. všechny grafické objekty je možné vykreslit V C++ implementujeme pomocí společného předka class IDrawable; požadavky na chování příslušníků zachytíme v jeho veřejných metodách např. virtual void paint(); Potomci si provádí vlastní implementaci těchto metod void CButton::paint() const {} (Společný předek nemusí mít smysl jako instance) Principy OOP - Dědičnost, rozhraní Principy OOP - Dědičnost, rozhraní

46 Čistě virtuální metoda (pure virtual) Metoda, která má ve třídě pouze svou deklaraci implementace je ponechána na potomky Syntaxe virtual návratový_typ metoda(parametry) = 0; Potomci standardním způsobem implementují překrývají čistě virtuální metodu předka Principy OOP - Dědičnost, rozhraní Principy OOP - Dědičnost, rozhraní

47 Abstraktní třída class CPersonInterface { public: virtual const char* get () = 0; virtual void print() = 0; }; Třída s alespoň jednou čistě virtuální metodou Nelze z ní přímo vytvářet instance (objekty) chyba při překladu Lze ale využít jako třídu pro dědění potomci překrývají virtuální metody abstraktního předka Analogie rozhraní v Javě může ale obsahovat implementaci některých funkcí Čistě abstraktní třída - všechny metody jsou čistě virtuální opravdové rozhraní ve stylu Javy Principy OOP - Dědičnost, rozhraní

48 Abstraktní třída - obrázek Čistě abstraktní třída Principy OOP - Dědičnost, rozhraní Abstraktní třída (může být část implementace) Třída s implementací (děláme objekty) Principy OOP - Dědičnost, rozhraní

49 Abstraktní třída - ukázka // Abstract class, at least // one method is pure virtual class IPerson { public: }; virtual const char* get () = 0; virtual void print() = 0; int main() { IPerson* person = new CStudent("novak@fi.muni.cz"); person->print(); delete person; return 0; } class CStudent : public IPerson { char m_ [max_ _length+1]; public: CStudent(const char* ) { strncpy(m_ , , MAX_ _LENGTH); m_ [max_ _length] = 0; } virtual const char* get () { return m_ ; } virtual void print() { cout << "Student: " << m_ << endl; } }; Principy OOP - Dědičnost, rozhraní Principy OOP - Dědičnost, rozhraní

50 Abstraktní třída - ukázka abstractclassdemo.cpp Čistě virtuální metoda Abstraktní třída Čistě abstraktní třída Potomek implementující abstraktní třídu Potomek implementující jen část čistě virtuálních metod Principy OOP - Dědičnost, rozhraní Principy OOP - Dědičnost, rozhraní

51 Psaní dobrého kódu (2) Označte virtuální ty metody, které budou v potomkovi definovat jeho specializaci SerializeIntoFile() kód pro manipulaci zápis do souboru bude v předkovi pro potomky virtuální funkce SerializeIntoBuffer() Nedělejte všechny metody virtuální pokud není třída zároveň čistě abstraktní (rozhraní) jinak svědčí spíš o špatném návrhu hierarchie Principy OOP - Dědičnost, rozhraní Principy OOP - Dědičnost, rozhraní

52 Operátor reference & 52 Principy OOP - Dědičnost, rozhraní

53 Reference na proměnnou Alternativní jméno pro objekt/proměnou (~alias) operátor reference je & int a = 1; int b = 5; int& reftoa1 = a; // First reference to a int& reftoa2 = a; // Another reference to a //int& uninitializedref; // error: uninitialized reference a += 9; operátor reftoa1 += 9; reference reftoa2 += 11; Určitá analogie s ukazatelem na proměnnou není ukazatel na objekt, ale má podobné použití není proměnná s adresou na původní 53 Principy OOP - Dědičnost, rozhraní

54 Předávání argumentů referencí Alternativa k předávání argumentů funkce ukazatelem volání hodnotou: volání odkazem: volání referencí: void byvalue(int A) { A = 10; } void bypointer(int* pa) { *pa = 10; } void byreference(int& A) { A = 10; } Zavolání funkce vypadá jako volání hodnotou při předávání referencí není vytvářena kopie objektu změna argumentu uvnitř funkce se ale projeví i mimo funkci 54 Principy OOP - Dědičnost, rozhraní

55 Konstantní reference Konstantní reference void foo(const typ& param) umožňuje specifikovat záměr programátoru o nakládání s objektem (referencí, ale nebude měněn) Kontrolováno během překladu konstatní reference na nekonstantní objekt - chyba změna nekonstantního objektu přes konstantní referenci - chyba void constreferencedemo(const int& A, const int* pb) { // We can read values cout << "a + b: " << A + *pb << endl; // But we can't change them A = 1; // error: assignment of read-only reference 'A' *pb = 1; // error: assignment of read-only location '* pb' } Principy OOP - Dědičnost, rozhraní

56 Konstantní reference detaily Pro parametry v hlavičce funkce/metody platí, že konstantní reference je "catch-all" Oproti normální referenci, která umí chytat pouze lvalue (to, co někde bydlí, má to adresu), tak konstantní umí chytat všechno, i dočasné objekty Právě proto, že je konstantní reference "catchall", tak má při určování, která fce se zavolá (při stejné signatuře) nižší prioritu, než funkce pouze s referencí 56 Principy OOP - Dědičnost, rozhraní

57 Reference - ukázka referencedemo.cpp více referencí na jedinou proměnnou nutnost inicializace reference předání argumentu referencí změna hodnoty mimo funkci konstantní reference 57 Principy OOP - Dědičnost, rozhraní

58 Rozhraní a dědičnost Rozhraní a práce s ním je klíčový koncept Abstrakce od konkrétní implementace Tvorba generického kódu Snadná rozšiřitelnost později Vyžaduje dobře navrženou hierarchii Dědičnost umožňuje potomkovi vystupovat jako datový typ předka Konkrétní implementace za rozhraní Násobná dědičnost vs. Kompozice Ne vždy je vhodné dědit, zvažte vždy kompozici 58 Principy OOP - Dědičnost, rozhraní

59 Shrnutí Už bylo 59 Principy OOP - Dědičnost, rozhraní

60 Bonus Principy OOP - Dědičnost, rozhraní

61 Principy OOP - Dědičnost, rozhraní

62 Deadly sins of programming Zkušenost není pouze jak věci dělat, ale i to jak je nedělat Co ale s postupy, které jsou lákavé, tušíme kontroverzi, ale veříme, že právě my to zvládneme? Vítejte ve světě programátorských hříchů Rowan Atkinson na nás sice pozapomněl Ale další už nikoli s.pdf Principy OOP - Dědičnost, rozhraní

63 Deadly sins of software development Lust (smilstvo) (overengineering) Gluttony (nestřídmost) (failing to refactor) Greed (lakomství) (competing across teams) Sloth (lenost) (not validating inputs) Wrath (hněv) (not commenting code) Envy (závist) (not using version control) Pride (pýcha) (not unit testing) 7-deadly-sins-software-development-872 Principy OOP - Dědičnost, rozhraní

64 Principy OOP - Dědičnost, rozhraní

65 Samostudium 65 Principy OOP - Dědičnost, rozhraní

66 Problém diamant, virtuální dědičnost 66 Principy OOP - Dědičnost, rozhraní

67 Problém typu diamant - motivace Třída CPerson string , get () Třída pro studenta class CStudent: public CPerson; get () vrací formát xnovak@fi Třída pro učitele class CTeacher: public CPerson; get () vrací formát novak@fi Cvičící, ale také student CPerson CStudent CTeacher CTeachStudent class CTeachStudent: public CStudent, public CTeacher; Co vrátí volání get ()? 67 Principy OOP - Dědičnost, rozhraní

68 Problém typu diamant kde je problém? Nelze zkompilovat Nevhodné použití dědičnosti (Vyskytuje se často) 68 Principy OOP - Dědičnost, rozhraní

69 Diamant ukázka #include <iostream> #include <string.h> using namespace std; #define MAX_ _LENGTH 30 class CPerson { protected: char m_ [max_ _length+1]; public: CPerson(const char* ) { strncpy(m_ , , MAX_ _LENGTH); m_ [max_ _length] = 0; } const char* get () { return m_ ; } }; int main() { CTeachStudent teachstud("novak@fi.muni.cz"); teachstud.get (); } return 0; class CStudent : public CPerson { public: CStudent(const char* ) : CPerson( ) {} }; class CTeacher : public CPerson { public: CTeacher(const char* ) : CPerson( ) {} }; class CTeachStudent : public CTeacher, public CStudent { public: CTeachStudent(const char* ) : CTeacher( ), CStudent( ) {} }; Principy OOP - Dědičnost, rozhraní

70 Problém typu diamant Vzniká při nevhodném využití násobné dědičnosti Třída CTeachStudent zdědila jednu kopii metody get od CStudent a druhou od CTeacher Při volání metody get () třídy CTeachStudent není jasné, která kopie dat/metod se má použít get () z CStudent nebo CTeacher? Obdobný problém by vnikl ve funkci print () void CTeachStudent::print () { cout << m_ ; } 70 Principy OOP - Dědičnost, rozhraní

71 Diamant plná kvalifikace Řešení pomocí plné kvalifikace jména metody/atributu teachstud.cteacher::get (); CTeacher::m_ ; Je nutné znát hierarchii, porušuje myšlenku zapouzdření class CTeachStudent : public CTeacher, public CStudent { public: CTeachStudent(const char* ) : CTeacher( ), CStudent( ) {} void print () { //cout << m_ ; cout << CTeacher::m_ ; } }; int main() { CTeachStudent teachstud("novak@fi.muni.cz"); //teachstud.get (); teachstud.cteacher::get (); 71 } return 0; Principy OOP - Dědičnost, rozhraní

72 Diamant - virtuální dědičnost Pomocí klíčového slova virtual přikážeme jedinou kopii atributů a tabulky metod používat opatrně class CStudent: virtual public CPerson; Problémem je, že už při deklaraci CStudent musíme tušit, že později nastane diamant Pokud se mixuje virtuální a nevirtuální dědičnost jen některá větev používá virtuální dědičnost tak stále vzniká více kopií 72 Principy OOP - Dědičnost, rozhraní

73 Dědičnost a virtuální dědičnost Problém typu diamand vzniká typicky při nevhodné OO hierarchii Virtuální dědičnost umožňuje obejít, ale MNOHEM vhodnější je přímo odstranit problém změnou hierarchie (pokud je možné) 73 Principy OOP - Dědičnost, rozhraní

PRINCIPY OOP, DĚDIČNOST. PB161 Principy OOP - Zapouzdření 30.9.2013

PRINCIPY OOP, DĚDIČNOST. PB161 Principy OOP - Zapouzdření 30.9.2013 PRINCIPY OOP, DĚDIČNOST 1 CO NÁS DNES ČEKÁ Operátor reference & Dědičnost a kompozice Kopírovací konstruktory, destruktory std::string 2 3 OPERÁTOR REFERENCE & REFERENCE NA PROMĚNNOU Alternativní jméno

Více

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

Programování v C++ 1, 6. cvičení Programování v C++ 1, 6. cvičení dědičnost, polymorfismus 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

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

PB161 Programování v jazyce C++ Přednáška 3 PB161 Programování v jazyce C++ Přednáška 3 Reference, const Přetěžování funkcí Statické atributy a metody Dědičnost a kompozice Nikola Beneš 5. října 2015 PB161 přednáška 3: reference, const, přetěžování,

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

Generické programování

Generické programování 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(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

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

Programování v C++ 1, 5. cvičení Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

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

Programování v C++ 3, 3. cvičení Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového

Více

Objektové programování

Objektové programování Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k

Více

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

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 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

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 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

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. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue. 23. Třídy, generické třídy, instance, skládání, statické metody a proměnné. Zapouzdření, konstruktory, konzistence objektu, zpřístupnění vnitřní implementace, modifikátory public a private. Polymorfismus,

Více

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

Programování v C++ 2, 4. cvičení Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva

Více

PB přednáška (5. října 2015)

PB přednáška (5. října 2015) PB161 3. přednáška (5. října 2015) Organizační Vnitrosemestrální test bude se konat 2. 11. 2015 v době přednášky dvě skupiny (12-13, 13-14) papírový odpovědník, max. 20 bodů bude obsahovat náplň předchozích

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

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

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting

Více

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

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.

Více

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

Chování konstruktorů a destruktorů při dědění Dědičnost V objektově orientovaném programování je dědičnost způsob, jak vytvořit novou třídu použitím již existujících definic jiných tříd. Takto vytvořené třídy přebírají vlastnosti a metody svého předka

Více

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

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

Více

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

24. listopadu 2013, Brno Připravil: David Procházka 24. listopadu 2013, Brno Připravil: David Procházka Dědičnost Základy objektového návrhu Časná a pozdní vazba Strana 2 / 22 Obsah přednášky 1 Časná a pozdní vazba 2 Rozhraní pro dědičnost 3 Konstruktory

Více

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP) IB111 Programování a algoritmizace Objektově orientované programování (OOP) OP a OOP Objekt Kombinuje data a funkce a poskytuje určité rozhraní. OP = objektové programování Vše musí být objekty Např. Smalltalk,

Více

Jazyk C# (seminář 3)

Jazyk C# (seminář 3) Jazyk C# (seminář 3) Pavel Procházka KMI October 8, 2014 Motivace Největší využití v programování okenních aplikací a GUI knihoven. Data reprezentujeme pomocí objektů (tříd), máme tedy ucelený pohled na

Více

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

PB161 Programování v jazyce C++ Přednáška 1 .. PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do OOP v C++ Nikola Beneš 21. září 2015 PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 1 / 39 Cíle předmětu 1. vysvětlit základy

Více

Abstraktní třídy, polymorfní struktury

Abstraktní třídy, polymorfní struktury Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní třídy, polymorfní struktury BI-PA2, 2011, Přednáška 9 1/32 Abstraktní třídy, polymorfní struktury Ing. Josef Vogel, CSc Katedra softwarového inženýrství

Více

20. Projekt Domácí mediotéka

20. Projekt Domácí mediotéka Projekt Domácí mediotéka strana 211 20. Projekt Domácí mediotéka 20.1. Základní popis, zadání úkolu V projektu Domácí mediotéka (Dome) se jednoduchým způsobem evidují CD a videa. Projekt je velmi jednoduchý

Více

PB161 Základy OOP. Tomáš Brukner

PB161 Základy OOP. Tomáš Brukner PB161 Základy OOP Tomáš Brukner Sylabus - Co je to OOP? Jaké jsou základní principy OOP? Jak se projevují v C++? https://cs.wikipedia.org/wiki/strahovská_knihovna SELECT * FROM books WHERE pages < 250

Více

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

PB161 Programování v jazyce C++ Přednáška 10 .. PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 23. listopadu 2015 PB161 přednáška 10: šablony 23. listopadu 2015 1 / 29 K zamyšlení Jaký je rozdíl mezi new int[10] a new int[10]()?

Více

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

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

Základy objektové orientace I. Únor 2010

Základy objektové orientace I. Únor 2010 Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných

Více

PREPROCESOR POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,

Více

Funkční objekty v C++.

Funkční objekty v C++. Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční

Více

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

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března Dědičnost Cíle lekce Cílem lekce je naučit se pracovat a využívat dědičnosti při návrhu a tvorbě programů. Lekce je zaměřena hlavně na jednoduchou dědičnost. Bude rovněž vysvětlen rozdíl mezi dědičností

Více

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

PB161 Programování v jazyce C++ Přednáška 8 .. PB161 Programování v jazyce C++ Přednáška 8 Výjimky Správa prostředků (RAII) Nikola Beneš 9. listopadu 2015 PB161 přednáška 8: výjimky, RAII 9. listopadu 2015 1 / 24 . PB161 přednáška 8: výjimky, RAII

Více

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

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

Virtuální metody - polymorfizmus

Virtuální metody - polymorfizmus - polymorfizmus - potomka lze použít v místě, kde je možné použít předka - v dosud probraných situacích byly vždy volány funkce, které jsou známy již v době překladu. V situaci, kdy v době překladu není

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Úvod Metody s časnou vazbou jsou překládány jako obyčejné céčkovské funkce. Této metodě je předán jako první implicitní parametr this. Rozdíl mezi obyčejnou

Více

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

11.5.2012. 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

11.5.2012. 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 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20

Více

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance

Více

Programování II. Polymorfismus

Programování II. Polymorfismus Programování II Polymorfismus Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad. Přetížení, překrytí, protected Přetížení x překrytí Přetížením řešíme doplnění

Více

Zpracoval: houzvjir@fel.cvut.cz

Zpracoval: houzvjir@fel.cvut.cz Zpracoval: houzvjir@fel.cvut.cz 10. Objektově orientované programování v C++. Přetěţování operátorů, generické funkce a třídy, výjimky, knihovny. (A7B36PJC) Obsah OOP v C++... 2 Pro připomenutí - Základní

Více

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

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object. Objekty v PHP 5.x This is an object-oriented system. If we change anything, the users object. Objektové PHP Objekty se poprvé objevili v PHP ve verzi 4. Nepříliš zdařilý pokus. Programátoři získali nedůvěru

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

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

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

Programování II. Návrh programu II

Programování II. Návrh programu II Programování II Návrh programu II Osnova přednášky Dědičnost shrnutí. Návrh programu s využitím dědičnosti Dědičnost shrnutí Klíčové otázky CO je dědičnost? PROČ použít dědičnost? KDY použít dědičnost?

Více

Konstruktory a destruktory

Konstruktory a destruktory Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,

Více

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. 13 Rozhraní, výjimky Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. Doba nutná k nastudování 2 2,5 hodiny

Více

Dědičnost (inheritance)

Dědičnost (inheritance) Dědičnost (inheritance) Úvod Umožňuje objektům převzít (zdědit) členy jiných objektů a pouze je rozšířit o Auto: lze odvodit Vztah je osobní auto, cisterna jsou auta Základní pojmy Bázová třída (rodič)

Více

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

Programování v C++ 2, 7. cvičení Programování v C++ 2, 7. cvičení spojový seznam 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené látky Dědění

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - operátor je speciální

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

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

IRAE 07/08 Přednáška č. 1 Úvod do předmětu OOP Objekt Proč OOP? Literatura, osnova předmětu viz. cvičení Základní prvek OOP sw inženýrství = model reálných objektů (věcí) člověk, auto, okno (ve windows), slovník, = model abstraktní

Více

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Zapouzdření. Tomáš Pitner, upravil Marek Šabo Zapouzdření Tomáš Pitner, upravil Marek Šabo Co je zapouzdření Naprosto zásadní vlastnost objektového přístupu, možná nejzásadnější Jde o spojení dat a práce s nimi do jednoho celku - objektu Data jsou

Více

PB přednáška (21. září 2015)

PB přednáška (21. září 2015) PB161 1. přednáška (21. září 2015) Cíle předmětu 1. vysvětlit základy OOP 2. seznámit s možnostmi jazyka C++ 3. (zavést a) podpořit praktické programátorské schopnosti 4. nadchnout do (nebo alespoň neodradit

Více

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo Statické proměnné a metody Tomáš Pitner, upravil Marek Šabo Úvod Se statickou metodou jsme se setkali už u úplně prvního programu - Hello, world! public class Demo { public static void main(string[] args)

Více

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

PB161 Programování v jazyce C++ Přednáška 10 PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 27. listopadu 2017 PB161 přednáška 10: šablony 27. listopadu 2017 1 / 33 Šablony PB161 přednáška 10: šablony 27. listopadu 2017 2 / 33

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Dynamická identifikace typů v C++.

Dynamická identifikace typů v C++. Dynamická identifikace typů v C++. Pod pojmem "Dynamická identifikace typů" rozumíme zjišťování typů proměnných, nebo objektů v době běhu programu. Identifikaci typů zajišťuje operátor typeid. Než se ale

Více

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

NPRG031 Programování II 1 / :25:46 NPRG031 Programování II 1 / 26 28. 2. 2018 11:25:46 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat jiné objekty

Více

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

NMIN201 Objektově orientované programování 1 / :36:09 NMIN201 Objektově orientované programování 1 / 26 8.10.2013 15:36:09 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat

Více

Jazyk C# (seminář 6)

Jazyk C# (seminář 6) Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

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

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161

Více

Vyřešené teoretické otázky do OOP ( )

Vyřešené teoretické otázky do OOP ( ) Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika

Více

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo Viditelnost Přístup ke třídám i jejim prvkům lze (podobně jako např. v C++) regulovat. Přístupem se rozumí jakékoli použití dané třídy, prvku

Více

Mělká a hluboká kopie

Mělká a hluboká kopie Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta

Více

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

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem Jazyk C++ 1 Blok 3 Objektové typy jazyka C++ Studijní cíl Ve třetím bloku bude představen a rozebrán nejdůležitější objektový typ jazyka C++ a to sice třída. Po absolvování bloku bude student schopen navrhovat

Více

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy 11 Diagram tříd, asociace, dědičnost, abstraktní třídy Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost diagramům tříd, asociaci,

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++ Dědičnost tříd Dědičnost umožňuje vytvářet nové třídy z tříd existujících tak, že odvozené třídy (tzv. potomci) dědí vlastnosti

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

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

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161

Více

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

Programování v C++ 2, 8. cvičení Programování v C++ 2, 8. cvičení návrhový vzor iterátor 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené látky

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce

Více

Návrhové vzory OMO, LS 2014/2015

Návrhové vzory OMO, LS 2014/2015 Návrhové vzory OMO, LS 2014/2015 Motivace Cílem objektového návrhu je strukturu aplikace navrhnout tak, aby splňovala následující kritéria: snadná rozšiřitelnost účelnost testovatelnost dokumentovatelnost

Více

Programování v C++ VI

Programování v C++ VI Programování v C++ VI Konstruktory, destruktory a dědičnost Konstruktory a dědičnost I když jsme se bavili o dědičnosti, trochu jsme zapomněli na konstruktory to se ale nevyplácí, vzpomeňte si, jak důležitý

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu

Více

konstruktory a destruktory (o)

konstruktory a destruktory (o) konstruktory a destruktory (o) - slouží k ovlivnění vzniku (inicializace) a zániku (úklid) objektu - základní myšlenkou je, že proměnná by měla být inicializována (nastavena do počátečního stavu) a zároveň

Více

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

PB161 Programování v jazyce C++ Přednáška 8 PB161 Programování v jazyce C++ Přednáška 8 Dědičnost Návrhové principy v OOP Nikola Beneš 13. listopadu 2018 PB161 přednáška 8: dědičnost, návrhové principy 13. listopadu 2018 1 / 30 Dědičnost PB161 přednáška

Více

Objektově orientované programování. Úvod

Objektově orientované programování. Úvod Objektově orientované programování Úvod Imperativní programovací styl klasický programovací styl používaný v době vzniku prvních vyšších programovacích jazyků těžiště programování je v tvorbě algoritmů

Více

Jazyk C++ I. Šablony 2

Jazyk C++ I. Šablony 2 Jazyk C++ I Šablony 2 AR 2013/2014 Jazyk C++ I Třídy template class TVektor { T *a; int n; static int PocInstanci; public: TVektor(int _n = 0) : n(_n) { a = new T[n]; PocInstanci++; } ~TVektor()

Více

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

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

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/04.0006

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/04.0006 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/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

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

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické Třídy, polymorfismus A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické Polymorfizmus ~ vícetvarost Polymorfizmus základní vlastnost objektového přístupu základní princip polymorfismu:

Více

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

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members) Osnova přednášky Programové prostředky řízení Úvod do C# II. Členy (Members) Jmenné prostory (Namespaces) Třídy (Classes) Struktury (Structs) Pavel Balda Západočeská univerzita v Plzni, FAV, KKY 2 Členy

Více

PB161 Programování v jazyce C++ Objektově Orientované Programování

PB161 Programování v jazyce C++ Objektově Orientované Programování Programování v jazyce C++ Objektově Orientované Programování Principy OOP zapouzdření, konstruktory, destruktory, const Principy OOP - Zapouzdření 22.9.2014 Organizační - materiály Slidy a příprava http://cecko.eu/public/pb161_cviceni

Více

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.

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. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

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

PB161 Programování v jazyce C++ Přednáška 2 PB161 Programování v jazyce C++ Přednáška 2 Základy objektů Reference, const Nikola Beneš 25. září 2018 PB161 přednáška 2: objekty, reference, const 25. září 2018 1 / 30 Jak funguje std::vector? (pro zvídavé)

Více

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19 Programování II Abstraktní třída Vícenásobná dědičnost 2018/19 Osnova přednášky Polymorfismus - důsledky. Abstraktní třída. Vícenásobná dědičnost. Polymorfismus - důsledky Polymorfismus Polymorfismus je

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace

Více

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

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++ Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++ Prostory jmen U programů mohou někdy nastat kolize mezi jmény (tříd, funkcí, globálních proměnných atd.) pokud v různých

Více

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance

Více

Abstraktní třída a rozhraní

Abstraktní třída a rozhraní Abstraktní třída a rozhraní Někdy se může stát, zejména při psaní v hierarchické struktuře hodně nadřazených tříd, že tušíme, že bude ve zděděných třídách vhodné použít nějakou metodu. Tuto metodu ještě

Více