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

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

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

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

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

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

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

Základy objektové orientace I. Únor 2010

Dědění, polymorfismus

Generické programování

PB161 Základy OOP. Tomáš Brukner

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

Mnohotvarost (polymorfizmus)

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

Programování II. Polymorfismus

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

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

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

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

Konstruktory a destruktory

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.

1. Programování proti rozhraní

Seminář Java II p.1/43

Objektově orientované programování. Úvod

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

Teoretické minimum z PJV

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

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

Objektové programování

1. Dědičnost a polymorfismus

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

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

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

PREPROCESOR POKRAČOVÁNÍ

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

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

Úvod do programovacích jazyků (Java)

20. Projekt Domácí mediotéka

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

Objektově orientované programování

Jazyk C++ I. Šablony 2

Přetěžování operátorů

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

Programování v jazyce C a C++

Zpracoval:

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

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/

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

Více o konstruktorech a destruktorech

Výčtový typ strana 67

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

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

Principy objektově orientovaného programování

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

Jazyk C++ I. Polymorfismus

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Návrhové vzory OMO, LS 2014/2015

Objektově orientované programování v jazyce Python

Obsah přednášky. Postup při vytváření objektů. Postup při vytváření objektů. Alokace paměti. Inicializace hodnot atributů

Jazyk C# (seminář 3)

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

typová konverze typová inference

Jazyk C++, některá rozšíření oproti C

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

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

KTE / ZPE Informační technologie

Objektově orientované programování v jazyce Python

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

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

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

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

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

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

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

Mělká a hluboká kopie

Virtuální metody - polymorfizmus

Objektově orientovaný přístup

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

Programování II. Návrh programu I 2018/19

konstruktory a destruktory (o)

Abstraktní třída a rozhraní

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

ADT/ADS = abstraktní datové typy / struktury

Jazyk C++ I. Polymorfismus

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

Ukazka knihy z internetoveho knihkupectvi

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

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

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

Funkční objekty v C++.

Vytváření a použití knihoven tříd

Diagram tříd (class diagram)

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

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

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

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

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

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

Úvod do programovacích jazyků (Java)

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

Zápis programu v jazyce C#

Transkript:

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, Ruby Relativně málo rozšířené v dnešní praxi OOP = objektově orientované programování Objekty jsou podporovány, ovšem ne všechno musí být nutně jen objekty. Např. C++, Java, Dnes velice rozšířený přístup

Terminologie Třída Typ objektu Objekt Instance třídy Struktura atributy (data) a metody (funkce) Základní vlastnosti objektů v OOP Abstrakce Zapouzdření Polymorfismus

Základní paradigmata OOP Datová abstrakce Zavedeme vlastní datový typ Struktura dat Operace nad těmito daty Oddělujeme rozhraní od implementace Zapouzdření prvků třídy Dědičnost Možnost rozšířit existující objekty Polymorfismus Stejné rozhraní k různým objektům (díky zděděným společným vlastnostem).

Zapouzdření Strukturální programování od sebe odděluje data a algoritmy (programový kód). OOP data zapouzdřuje v objektech a práce s nimi je umožněna přes definované rozhraní (pomocí metod objektu). Díky zapouzdření není třeba znát detaily implementace, ale stačí znát a používat rozhraní objektu. Díky zapouzdření je také možné změnit implementaci pokud použijeme stejné rozhraní. Díky utajení je také možné vyhnout se chybám při náhodné nebo nesprávné přímé modifikaci dat. Umožňuje rozdělit úkoly v týmu programátorů.

Zapouzdření příklad v C struct student { int narozeni_rok, narozeni_mesic, narozeni_den; float studijni_prumer; char jmeno[30]; int vypocitej_vek(); };

Zapouzdření příklad v Pythonu class student: narozeni_rok, narozeni_mesic, narozeni_den = 0,0,0 studijni_prumer, jmeno = 0.0, " def vypocitej_vek(self):

Zapouzdření Data a metody ve třídě mohou být několika typů podle jejich viditelnosti public k datům a proměnným je volný přístup Správný OOP program by měl ponechat public pouze metody, ne data. private metody a data nejsou přístupná z jiných částí kódu něž z metod této třídy protected metody a data nejsou volně přístupné, ale jsou přístupné potomkům této třídy.

Zapouzdření - příklad epeněženka rozhraní třídy class penezenka { private: int koruny, halire; public: penezenka () { koruny = halire = 0; }; }; void nabij (int k); BOOL zaplat (int k, int h); void vypis_aktualni_stav();

Zapouzdření - příklad Implementace void penezenka::nabij (int k) { koruny+=k; } BOOL penezenka::zaplat (int k, int h) { long zbytek = koruny*100+halire (k*100+h); if(zbytek<0) return FALSE; koruny = zbytek /100; halire = zbytek%100; return TRUE; }

Zapouzdření - příklad Použití: penezenka moje, cizi; void penezenka::nabij (int k) { koruny+=k; } moje.nabij(100); moje.zaplat(2,50); moje.vypis_aktualni_stav(); moje: 100 cizi.nabij(5); cizi.vypis_aktualni_stav(); cizi: 5

Zapouzdření - Python class MyClass: i = 12345 def f(self): return 'hello world' Python nezná private členy třídy Domluva: co začíná znakem _ je neveřejné Specialitka: co začíná tak se upraví

Python - příklad

Dědičnost Dědičnost umožňuje rozšiřování funkčnosti třídy. Potomek je nová třída založená na třídě původní (rodičovské). Potomek přebírá vlastnosti rodiče a může být dál rozšiřován (nová data a metody).

Dědičnost - příklad Základní objekt (rodič) bude člověk. Potomky budou student, zaměstnanec a učitel. Každý člověk má základní atributy jako jméno, příjmení, datum narození a adresu. Studenti mají navíc studijní průměr, a jsou zapsáni v určitém ročníku. Zaměstnanci mají plat a ten je jim posílán na nějaký bankovní účet. Učitelé jsou zaměstnanci, ale mají konzultační hodiny a učí nějaké předměty

Dědičnost - příklad Člověk Student Zaměstnanec Učitel

Příklad v Pythonu

Dědičnost příklad v C++ class clovek { public: char jmeno[20],prijmeni[30]; int narozeni_rok, narozeni_masic, narozeni_den; char adresa [100]; int vypocitej_vek(); }; class student : public clovek { public: int rocnik; float prumer; }; class zamestnanec : public clovek { public: int plat; char IBAN [20]; }; class ucitel : public zamestnanec { public: char konzultacky[50]; list_of_subjects *uci; };

Dědičnost příklad v C++ clovek c; zamestnanec z ; ucitel u; int v1= c.vypocitej_vek(); int v2= z.vypocitej_vek(); c = u; z = c; // i učitel je člověk // NELZE ne každý člověk je zaměstnanec

Polymorfismus Polymorfismus = jednotné zacházení s různými (polymorfními) objekty mající některé společné zděděné vlastnosti. Polymorfismus v praxi znamená, že je možné mít různé třídy s metodami se stejnými parametry. Mohu tak odlišit chování potomků. Pozdní vazba late binding Polymorfismus umožňuje mít stejně pojmenované metody s různými parametry. Parametry se mohou lišit v počtu a/nebo typu. Mluvíme o tzv. přetížení metod (funkcí).

Příklad v Pythonu

Polymorfismus - příklad void penezenka::zaplat (int k, int h) { long zbytek = koruny*100+halire (k*100+h); if(zbytek<0) return FALSE; koruny = zbytek /100; halire = zbytek%100; return TRUE; } void penezenka::zaplat (int k) { long zbytek = koruny k; if(zbytek<0) return FALSE; koruny = zbytek; return TRUE; } void penezenka::zaplat (void) { long zbytek = koruny 10; if(zbytek<0) return FALSE; koruny = zbytek; return TRUE; }

Polymorfismus - příklad penezenka moje; moje.nabij(100); moje.zaplat(10,0); moje.zaplat(10); moje.zaplat(); moje.vypis_aktualni_stav();

Oprátory new, delete v C++ Vytvoření objektu a jeho rušení pomocí dynamické alokace paměti. penezenka *moje = new penezenka; moje -> nabij(100); moje -> zaplat(5,50); delete moje;

Konstruktory, destruktory Metody, které jsou (automaticky) volány při vytváření/rušení instance objektu. Vhodné pro Inicializaci proměnných Alokaci/dealokaci paměti

Kontruktory - příklad class student { private: float prumer; char *jmeno; public: student () {prumer=0.0; jmeno=null; } student(float p,char *j) { prumer=p; jmeno = (char*)malloc(strlen(j)+1); if(jmeno)strcpy(jmeno,j); } ~student() { if(jmeno) free(jmeno); } };

Příklad v Pythonu

Přetěžování operátorů v C++ Mohu přetížit (změnit) běžné operátory Např. +, -, += Přetížit lze téměř všechny operátory Nelze přetížit.,?:, sizeof, ::,.* Přetížení operátorů velice usnadňuje používání tříd/objektů programátory

Přetěžování operátorů -příklad class komplex { public: float Re, Im; }; komplex (float r, float i) { Re=r; Im=i; }; komplex komplex::operator+=(komplex &b) { Re+=b.Re; Im+=b.Im; return *this; }; komplex komplex::operator+(komplex &b) { return komplex (Re + b.re, Im + b.im); }; komplex a(1,0), b(2,0); komplex c = a + b; c+= komplex(1,5);

Přetěžování operátorů v Pythonu

Přetěžování operátorů v Pythonu