Principy OOP - rozhraní, dědičnost PB161
|
|
- Otakar Prokop
- před 9 lety
- Počet zobrazení:
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 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
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é
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í,
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á
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 =
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é
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
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
Ú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
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
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
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,
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
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 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í
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
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ář
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
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í.
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
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;
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
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,
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
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
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í
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ý
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
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]()?
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
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
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,
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í
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í
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
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ě
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í
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í
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
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:
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í
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
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
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í
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í
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
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ů
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
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?
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,
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
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č)
<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************
zdroje/zdroje.xml
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í
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ýč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
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í
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
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
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)
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
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
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
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
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
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í
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
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
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
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
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
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
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,
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
Ú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
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ů
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
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
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
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
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ý
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
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ň
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
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ů
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()
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
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
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
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:
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
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
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
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í
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é)
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
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
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
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
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ě