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

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

Abstraktní třída a rozhraní

typová konverze typová inference

Generické programování

1. Dědičnost a polymorfismus

20. Projekt Domácí mediotéka

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

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

1. Programování proti rozhraní

Úvod do programovacích jazyků (Java)

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

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/

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

Abstraktní datové typy: zásobník

Výčtový typ strana 67

Programovací jazyk Java

Seminář Java IV p.1/38

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

9. Polymorfismus a rozhraní

KTE / ZPE Informační technologie

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

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

PREPROCESOR POKRAČOVÁNÍ

Teoretické minimum z PJV

Programování v Javě I. Leden 2008

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

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

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

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

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

10 Generické implementace

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.

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

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.

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

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

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

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

Seminář Java II p.1/43

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

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

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

IRAE 07/08 Přednáška č. 7. Začátek (head)

Základy objektové orientace I. Únor 2010

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

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

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

5 Rekurze a zásobník. Rekurzivní volání metody

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

15. Projekt Kalkulačka

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Algoritmizace a programování

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

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

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

Principy objektově orientovaného programování

Java - řazení objektů

7.5 Diagram tříd pokročilé techniky

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

Java a XML. 10/26/09 1/7 Java a XML

Dědičnost (inheritance)

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

Třídy a dědičnost. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

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.

Objektově orientované programování

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Abstraktní třídy, polymorfní struktury

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

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

7.5 Diagram tříd pokročilé techniky

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

Datové struktury. alg12 1

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

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

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

Remote Method Invocation RMI

Jazyk C# (seminář 3)

TÉMATICKÝ OKRUH Softwarové inženýrství

Návrhové vzory OMO, LS 2014/2015

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Dědění, polymorfismus

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

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

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

Java Výjimky Java, zimní semestr

Úvod do programování v jazyce Java

Projekty pro výuku programování v jazyce Java

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Objektové programování

UJO Framework. revoluční architektura beans. verze

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

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

9. přednáška - třídy, objekty

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

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

VZOR. Vzor přijímacího testu do magisterského studia oboru Otevřená informatika

Java - výjimky. private void vstup() throws IOException {... }

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

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Návrhové vzory Design Patterns

Transkript:

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: schopnost metody pracovat ( přizpůsobit se ) podle typu objektu, na který působí příklady: točit volantem, zaplatit vypni, 2

Polymorfismus - příklad Co má zobrazená hierarchie tříd společné? SPÍNAČ!!! lze spustit zařízení způsob spuštění závisí na typu objektu zařízení na elektřinu domácí spotřebič elektromobil počítač lednice sekačka notebook motorový člun mobilní telefon 3

Polymorfismus, řešení: abstraktní třída Jedno řešení polymorfismu je použití abstraktní třídy (AT) AT slouží pro specifikaci společných vlastností AT zajistí jednotné pojmenování společných metod při zachování specifického chování dotčeného objektu POLYMORFISMUS Často nepoužitelné nutná hierachie tříd přednost má interface 4

Abstraktní třída Abstrakce (abstraktní třídy) - přínos objektového přístupu Příklad: čítače - abstraktní metody zvetsi() zmensi() reset() Všechny třídy implementující čítače mají uvedené metody, resp. každá třída, která implementuje čítač musí tyto metody implementovat Lze tedy zavést jednu abstraktní třídu charakterizující hierarchii všech tříd čítačů, tato abstraktní třída je kořenem této hierarchie Abstraktní třída je společný předek tříd, jejichž metody (abstraktní) vyžadujme naprogramovat podle potřeb příslušných podtříd

Abstraktní třída public abstract class CitacAbstraktni { static int hodnota = 0; abstract int gethodnota(); abstract void zvetsi(); abstract void zmensi(); abstract void nastav(); Abstraktní datový typ, pouze rozhraní class MujCitac extends CitacAbstraktni { public int gethodnota(){return hodnota; public void zvetsi(){hodnota++; public void zmensi(){hodnota--; public void reset(){hodnota = 0; Implementace datového typu Pro uživatele je implementace skryta, používá jen veřejné metody objektu A0B36PR1-11 6

Abstraktní třída class JinyCitac extends MujCitac { public void zvetsi(){ if(hodnota >=4)hodnota=0; else hodnota++; public void zmensi(){ if(hodnota < 0)hodnota=4;else hodnota--; A0B36PR1-11 7

Abstraktní třída class CitacZnakovy extends CitacAbstraktni { static char hodnota = 'a'; public int gethodnota(){return hodnota; public void zvetsi(){hodnota=(char)(((int)hodnota)+1); public void zmensi(){hodnota=(char)((int)hodnota-1); public void nastav(){hodnota = 'a';

Abstraktní třída, abstraktní metody Abstrakce (abstraktní třídy) - přínos objektového přístupu Příklad: grafické objekty - abstraktní metody abstract void otoc(); abstract void zmensi(); Společný předek tříd, jejichž (některé) metody vyžadujme naprogramovat podle potřeb příslušných podtříd Implementace je přenechána následníkům resp. implementace je vynucena Abstraktní třída může obsahovat datové složky a neabstraktní metody Třídy mají společnou vlastnost vyjádřenou jako abstraktní metoda Předpoklad systematického polymorfismu stejný název metody, různá funkce pro různé objekty lze vytvořit referenci na abstraktní třídu, nikoli její instanci! Metody jsou označeny abstract,mají svůj typ, ale nemají parametry ani tělo Třída s alespoň jedinou abstraktní metodou je abstraktní třídou, označená rovněž abstract class Přeprogramovávat je povinné jen abstraktní metody Detaily implementace jsou ponechány na příslušných potomcích, proto abstraktní třídy neimplementují konkrétní těla metod 9

Abstraktní třída - příklad abstract class Rodic { public int i; abstract int znasob(); void seti(int novei) { i = novei; class Potomek1 extends Rodic { int znasob() { return i * 2; class Potomek2 extends Rodic { int znasob() { return i * 3; Výstup: Hodnota je: 6 Hodnota je: 9 public static void main(string[] args) { Rodic pot; pot = new Potomek1(); pot.seti(3); System.out.println("Hodnota je: " + pot.znasob()); pot = new Potomek2(); pot.seti(3); System.out.println("Hodnota je: " + pot.znasob()); 10

Abstraktní třídy a polymorfizmus Pomocí referenční proměnné předka lze využívat i metody potomka Lze použít referenční proměnnou na abstraktní třídu Často se využívají abstraktní metody k definici universálního předka Jasně nadefinujeme, jakou signaturu musejí mít některé metody následníků pro jednotné ovládání, donutíme programátory to respektovat (nebo rozhraním viz dále) Možnost rozšiřování, ování, není nutný žádný switch Použití abstraktní třídy není nutné, kořenová třída nemusí být abstraktní Jiná možnost pro polymorfismus - interface 11

Rozhraní interface Co mají zobrazené třídy společné? SPÍNAČ!!! Je možné najít společného předka? Není, resp. bylo by to nepřirozené!!! Řešení rozhraní, interface!!! počítač notebook domácí spotřebič sekačka automobil lednice motorový člun mobilní telefon 12

Rozhraní - interface Java neumožňuje vícenásobnou dědičnost (problematická záležitost) řešení rozhraní (interface) Koncepčně můžeme interface považovat za totálně abstraktní třídu, která může obsahovat pouze: abstraktní metody konstanty (implicitně public static final) Interface je konstrukce, která definuje přidané a vyžadované vlastnosti třídy výčtem jejích instančních metod Deklarace rozhraní = deklarace hlaviček metod bez implementace, podobně jako v abstraktních metodách Třída, která chce rozhraní použít, musí všechny metody rozhraní implementovat (překrýt) 13

Použití interface, implementace Rozhraní jsou implementována třídami Objekty tříd, které implementují stejné rozhraní jsou "zaměnitelné" tímto rozhraním obdobně, jako jsou zaměnitelné hardwarové prvky se stejným rozhraním Rozhraní má tyto vlastnosti (na rozdíl od abstraktní třídy): nedeklaruje žádné proměnné třída může implementovat více rozhraní!! rozhraní nesouvisí s dědičností tříd, s hierarchií tříd různé třídy a implementace téhož rozhraní! nevynucuje příbuzenské vztahy vnucuje dovednosti těm, co by toho měly být schopni příklad Serializable!! viz PR1 14

Rozhraní - příklad interface Inter { public void jednotnyvystup(); class Prvni implements Inter { int data; Prvni Druha Prvni(int vstup) { this.data = 14 * vstup; public void jednotnyvystup (){ System.out.println("Data jsou ciselna: " + this.data); class Druha implements Inter { String data; Druha(char vstup) { this.data = "string " + vstup; public void jednotnyvystup (){ System.out.println("Data jsou retezec: " + this.data); public class Testrozhrani{ public static void main(string[] args) { new Prvni(14).jednotnyVystup(); new Druha('g').jednotnyVystup(); Data jsou ciselna: 196 Data jsou retezec: string g 15

Použití rozhraní jako referenční proměnné Proměnnou rozhrani je možné jako referenční proměnnou pro reference na instance tříd, které toto rozhraní implementují Je možné volat takto metody rozhraní, nikoli metody tříd! public class Test_rozhrani{ public static void main(string[] args) { Inter i; Prvni p = new Prvni(14); i=p; i.jednotnyvystup(); Druha d = new Druha('g'); i=d; i.jednotnyvystup(); 16

Příklad 2: ADT - programově public interface Citac { public int gethodnota(); public void zvetsi(); public void zmensi(); public void reset(); Abstraktní datový typ, pouze rozhraní public class MujCitac implements Citac { private int hodnota = 0; public int gethodnota(){return hodnota; public void zvetsi(){hodnota++; public void zmensi(){hodnota--; public void reset(){hodnota = 0; Implementace datového typu Pro uživatele je implementace skryta, používá jen veřejné metody objektu A0B36PR1-11 17

Příklad2: ADT - programově public class JinyCitac implements Citac { private static int hodnota; public int gethodnota(){return hodnota; public void zvetsi(){if {(hodnota >=4 ) hodnota=0;else hodnota++; public void zmensi(){if (hodnota < 0) hodnota=4;else hodnota--; public void reset(){hodnota = 0; A0B36PR1-11 18

Oblasti použití rozhraní Vnucení metod třídě bez nutnosti zařazení do hierarchie Vytváření "vícenásobného" dědění Nalezení podobných "dovedností" pro třídy různých hierarchií mohly vzniknout děděním tříd z knihovny, jiných autorů... společný předek by byl vykonstruovaný Trend - použití rozhraní namísto abstraktních tříd dodávka: neabstraktní třída + rozhraní (popisuje všechny metody) Pozn: Abstraktní třída může implementovat rozhraní bez skutečné implementace těla metod rozhraní 19

Polymorfizmus a rozhraní - příklad I Je-li nutné přistupovat k třídám různých hierarchií stejným způsobem a nelze-li vytvořit společného předka, pak použijeme rozhraní interface Vazitelny { public void vypishmotnost(); class Clovek implements Vazitelny { int vaha; String profese; Clovek(String povolani, int tiha) { profese = povolani; vaha = tiha; public void vypishmotnost() { System.out.println(profese + ": " + vaha); public int gethmotnost() { return vaha; 20

Polymorfizmus a rozhraní - příklad II class Kufr implements Vazitelny { int vaha; Kufr(int tiha) { vaha = tiha; public void vypishmotnost() { System.out.println("kufr: " + vaha); 21

Polymorfizmus a rozhraní - příklad III public class PolymRozhra { public static void main(string[] args) { int vahalidi = 0; Vazitelny[] kusjakokus = new Vazitelny[3]; kusjakokus[0] = new Clovek("programator", 100); kusjakokus[1] = new Kufr(20); kusjakokus[2] = new Clovek("modelka", 51); for (int i = 0; i < kusjakokus.length; i++) { kusjakokus[i].vypishmotnost(); if (kusjakokus[i] instanceof Clovek == true) vahalidi += ((Clovek) kusjakokus[i]).gethmotnost(); //nutno přetypovat!! System.out.println("Ziva vaha: " + vahalidi); programator: 100 kufr: 20 modelka: 51 Ziva vaha: 151 22

Srovnání rozhraní a abstraktní třídy interface abstraktní třída obsahuje pouze abstraktní metody může obsahovat i neabstraktní metody obsahuje pouze konstanty může obsahovat libovolné položky nemusí mít předchůdce vždy má nadtřídu (např. object) třída může implementovat více rozhraní třída může rozšiřovat právě jednu nadtřídu 23

Třída x abstraktní třída x rozhraní Rozhraní = interface totálně abstraktní třída nemůže obsahovat atributy může obsahovat pouze konstanty nemůže mít implementované metody všechny jeho metody jsou abstraktní metody nemůže mít konstruktor nelze vytvořit instanci Třída = class nesmí obsahovat abstraktní metody Abstraktní třída = abstract class nedodělaná třída může obsahovat atributy může mít implementované metody může mít i neabstraktní metody může mít konstruktor nelze vytvořit instanci (konstruktor lze volat z potomka) 24

Konec 25

Ukázka vytváření UML diagramů tříd v Netbeans, R6.7 Reverzní inženýrství Pravým tlačítkem na projekt Vybrat Reverse engineering, O.K. rozkliknout v UML projektu - Model záložku Model pravým tlačítkem kliknout na balíček z java projektu a zvolit "Create Diagram". Potom vybrat třeba "Class diagram" a mělo by se otevřít okénko Pro experimety 26

Abstraktní třída příklad Příklad návrh menu (a základních funkcí ) pro grafický editor Třída Grafický objekt má metody společné pro všechny podtřídy Třída Grafický objekt nemá konkrétní instanci Od všech následníků požadujeme, aby se uměly vytvořit, zmenšit, posunout, otočit a překlopit Grafický objekt Vytvoř Zmenši Posun Otoč Překlop 27

Diagram tříd - příklad Trojúhelník je potomkem O2D Chaloupka obsahuje atribut strecha typu Trojúhelník - kompozice 28

Diagram tříd - příklad Kam bychom zařadili textový řetězec? mnohoúhelník? městečko? 29