PB161 Základy OOP. Tomáš Brukner

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

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

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

Dědění, polymorfismus

Programování II. Polymorfismus

Generické programování

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

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

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

Základy objektové orientace I. Únor 2010

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

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

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.

Návrhové vzory OMO, LS 2014/2015

20. Projekt Domácí mediotéka

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

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

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

1. Dědičnost a polymorfismus

Jazyk C# (seminář 3)

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

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

Objektově orientované programování v jazyce Python

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

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

Objektové programování

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

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

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

PB přednáška (23. listopadu 2015)

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

Zápis programu v jazyce C#

Sada 1 - Základy programování

1. Programování proti rozhraní

Programování II. Modularita 2017/18

PREPROCESOR POKRAČOVÁNÍ

Objektově orientované programování v jazyce Python

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

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

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

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

10 Balíčky, grafické znázornění tříd, základy zapozdření

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

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

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

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

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

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

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

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

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Programování v C++ VI

IB111 Programování a algoritmizace. Programovací jazyky

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

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

11. Přehled prog. jazyků

Programovací jazyky Přehled a vývoj

Polymorfismus. Porovnání jazyků z hlediska polymorfismu Jazyky C, C++, C# Jazyk Java PHP a jiné Na závěr souhrn vlastností jednotlivých jazyků

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

Programování II. Návrh programu II

Nepravidlové a hybridní znalostní systémy

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

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

Výčtový typ strana 67

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

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

Objektově orientované programování. Úvod

Jazyk C++ I. Šablony 2

9. Polymorfismus a rozhraní

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

Úvod do programovacích jazyků (Java)

Teoretické minimum z PJV

Matematika v programovacích

Úvod do programovacích jazyků (Java)

Jakub Čermák Microsoft Student Partner

IB111 Úvod do programování skrze Python Přednáška 13

ADT/ADS = abstraktní datové typy / struktury

Kód, který se nebude často měnit

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

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

Virtuální metody - polymorfizmus

Úvod. Programovací paradigmata

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

Jazyk C++ I. Šablony

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

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

Objektově orientovaný přístup

Principy objektově orientovaného programování

Jazyk C++ I. Polymorfismus

DTP Základy programování Úvod do předmětu

Diagramy tříd - základy

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

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

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

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

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/

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Funkční objekty v C++.

Transkript:

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 AND student_friendly = True

struct Book { const char* name; const char* author; unsigned pages; bool student_friendly; }; for(unsigned i = 0; i < books_size; ++i) { if (books[i].pages < 250 && books[i].student_friendly) { printf("%s: %s", books[i].author, books[i].name); } }

class Book { public: const std::string name; const std::string author; const unsigned pages; const bool student_friendly; unsigned getpagewithrecommendations() const; };

Paradigmata - Deklarativní - SQL, funkcionální jazyky, logické... - Imperativní - Procedurální - C, Pascal... - Objektově orientované - C++, Java, Python Více: https://en.wikipedia.org/wiki/list_of_programming_languages_by_type

Jedno paradigma?

Jedno paradigma? - C++ (generic, imperative, object-oriented (class-based), functional) - ECMAScript (functional, imperative, object-oriented (prototype-based)) - Python (functional, compiled, interpreted, object-oriented (class-based), imperative, metaprogramming, extension, impure, interactive mode, iterative, reflective, scripting) Více: https://en.wikipedia.org/wiki/list_of_programming_languages_by_type

https://en.wikipedia.org/wiki/comparison_of_multi-paradigm_programming_languages

Objektový pohled na svět

Objektový pohled na svět - principy - Svět se skládá z objektů - Každý objekt má svůj vnitřní stav - Objekty mezi sebou komunikují pomocí zpráv

Objektový pohled na svět - principy - Směrem ven je objekt černá skříňka. - Zaměřujete se pouze na to, jak objekt komunikuje. - Nemusíte znát vnitřnosti - skrýváte je před zbytkem světa. Zapouzdření

Objektový pohled na svět - principy - Jedinou povolenou komunikací jsou zprávy. - Samotná zpráva je objektem. - Objekt musí přijmout zprávu, které rozumí, a odmítnout tu, které nerozumí. Abstrakce

Objektový pohled na svět - principy - Různé objekty mohou umět zpracovat stejnou zprávu. - Reakce se ale mohou liši. - Z pohledu odesílatele je důležité chování, samotné objekty jsou zaměnitelné. Polymorfismus c = a + b; 3 = 1 + 2; "ahoj" = "a" + "hoj"; http://www.micheltriana.com/blog/2011/02/03/polymorphism-back-to-school

Objektový pohled na svět - pravidla - Pokud by všechny objekty byly unikátní, musel by být každý objekt velmi pracně definován. - Proto je možnost stavět jeden objekt na nějakém jiném. - A to buď z pohledu znovuvyužití implementace, anebo doimplementování chování. Dědičnost http://www.nemovitosti-inzerce.cz/galleries/gallery20141221/medium-2015-03-21-1w3yw37ky7h.jpg

Principy OOP - Zapouzdření Abstrakce Polymorfismus Dědičnost

OOP příklady

Laboratoř V laborator i jsou pe stovane ru zne druhy zvı r at. V tuto chvı li pouze mys i a pavouci. Zvı r ata se pohybujı po ohranic ene m prostoru, ve ktere m se nacha zı potrava. Pokud se k nı dostanou, sez erou ji a vyrostou v za vislosti na druhu zvı r ete.

OOP v C++

Zapouzdření - Na jednom místě jsou data (atributy) i kód (metody). Objekty jsou instance tříd, posílání zpráv volání metod. Klíčová slova public, private a protected Proč se v C++ používají i veřejné atributy oproti jiným jazykům?

Zapouzdření - Omezení toho, co vnější svět může udělat ochrana proti chybám Nutí vás program rozvrhnout do nezávislých částí vnějších a vnitřních Umožňuje změnit implementační detaily bez ohledu na uživatele. class Counter { public: unsigned getcount() const; private: void setcount(); protected: unsigned calculatecount() const; };

Abstrakce - Lze pracovat s ideální představou, nikoliv s implementačními detaily. Jak souvisí se zapouzdřením? - Datová abstrakce - Můžete přistupovat k datům, aniž byste věděli, kde a jak fyzicky jsou. - Paměť, disk, server; JPG, GIF, BMP Funkční abstrakce - Nemusíte vědět, jak se nějaká akce udělá; jde vám o to ji vyvolat. - Uložení obrázku. - class Image { public: Color getpixel(unsigned x, unsigned y) const; void putpixel(unsigned x, unsigned y, Color color); void save(); };

Abstrakce - Důležité je vnější chování. To definuje rozhraní. Co do něj patří? public private protected

Polymorfismus - Různé chování na základě typu. Umožňuje se objektům zachovat různě v závislosti na typu. Jak to souvisí s abstrakcí? - Přetěžování metod - c = a + b; Typově parametrizovaný - vector<int>, vector<bool> Podtypy - out << "Vypis - ale kam?"; -

Polymorfismu - podtypy - Předem je nadefinováné rozhraní - interface Nějaká jiná třída může toto rozhraní naplnit - dodat mu chování. Vnější pozorovatel může tuto třídu používat skrz interface class Image { //interface public: virtual Color getpixel(unsigned x, unsigned y) const = 0; virtual void putpixel(unsigned x, unsigned y, Color color) = 0; virtual void save() = 0; };

Dědičnost - Způsob realizace podtypů. Zároveň umožňuje znovu použít kód (o tom příště). Umožňuje vytvořit třídu, který lze referovat referencí nadřazeného typu. Jak to souvisí s polymorfismem? class GIF : public Image { public: virtual Color getpixel(unsigned x, unsigned y) const override { /* omitted */ } virtual void putpixel(unsigned x, unsigned y, Color color) override { /*... */ } virtual void save() override { /* omitted */ } }; GIF gif("img.gif"); Image &img = gif; img.putpixel(0, 0, BLACK); img.save();

class Image { public: virtual Color getpixel(unsigned x, unsigned y) const = 0; virtual void putpixel(unsigned x, unsigned y, Color color) = 0; virtual void save() = 0 }; class GIF : public Image { public: virtual Color getpixel(unsigned x, unsigned y) const override {} virtual void putpixel(unsigned x, unsigned y, Color color) override {} virtual void save() override {} }; class JPG: public Image { /* omitted */ }; class BMP: public Image { /* omitted */ }; GIF gif("img.gif"); JPG jpg("img.jpg"); BMP bmp("img.bmp"); Image &img = gif; //or jpg, or bmp img.putpixel(0, 0, BLACK); img.save();

Principy OOP - Zapouzdření Abstrakce Polymorfismus Dědičnost Proč ne čistý OOP jazyk?

Magické virtual - Překladač musí vědět, co má zavolat za metodu. Normálně to ví - v asembleru bude přímo adresa funkce, která se má zavolat. To je brzká vazba; již v době překladu je známo, která implementace se zavolá. https://godbolt.org/g/bzccoj

Magické virtual - Každý potomek má tabulku virtuálních funkcí, do které se za běhu program podívá, kterou implementaci má vlastně zavolat. To je pozdní vazba; implementace se určuje až za běhu programu. https://godbolt.org/g/efpiuv http://www-h.eng.cam.ac.uk/help/importedhtml/languages/ C++/Thinking_in_C++/tic0156.html

Včasná vs pozdní vazba Včasná vazba Pozdní vazba Implementace známá v době překladu Implementace určena až za běhu V asm přímo adresa funkce Nutné se podívat do vtable Rychlejší Pomalejší https://godbolt.org/g/bzccoj https://godbolt.org/g/efpiuv

Další informace k dědičnosti - Mohu dědit několikrát? Mohu mít některé metody definované v předkovi? Mohu se nějak dostat k metodám potomka? Mohu dědit jinak, než public? Jaké jsou alternativy k dědičnosti?

Díky za pozornost