Polymorfismus = Mnohotvarost

Slides:



Advertisements
Podobné prezentace
(instance konkrétní třídy)
Advertisements

ÚVOD DO C++ 3 TŘÍDY a objekty - POKRAČOVÁNÍ
OOP OOP (Object Oriented Programming)
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Polymorfismus Dědičnost
Čtvrté cvičení Objektové programování Objektový model v Javě
J a v a Začínáme programovat Lucie Žoltá Přetěžování metod, rekurze.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
Objekty v CLIPSu RNDr. Jiří Dvořák, CSc.
Druhá přednáška Datové typy a operátory Zapouzdření Pojem rozhraní
C# - datové typy Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Objektové programování a výjimky 2. cvičení Y36PJV, X36PJV
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Vaše jistota na trhu IT Generické a parametrizované datové typy a metody Rudolf PECINOVSKÝ 1.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Třída jako zdroj funkcionality
C# - Exceptions (výjimky)
Objektové programování
Podpora vláken a jejich synchronizace v jazyce C# Jan Kučera Jan Mittner Petr Effenberger 4IT353 Klient/server aplikace v Javě.
Dynamická alokace, polymorfismus
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
6. cvičení Polymorfismus
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
PB161 Právo friend, přetěžování operátorů, přetypování PB161 | Friend, operátory PB161 – Programování v jazyce C++ Objektově Orientované Programování.
Čísla Desetinná čísla. čísla desetinná se v PC ukládají jiným způsobem než čísla celá – výpočty s nimi provádí dvě odlišné části procesoru při výpočtech.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
13/04/20151 Indexery (1) Členy třídy (struktury) umožňující třídě (struk- tuře) používat hranaté závorky a pracovat s ní podobně jako s polem (používat.
13/04/20151 Datový typ třída – class (1) Datový typ definovaný uživatelem Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace Charakterizuje.
JAVA Tutoriál Ing. Lumír Návrat, A1018 Tel:
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
PJV031 Přetypování (casting) Objekty, atributy, lokální proměnné, parametry a návratové hodnoty metod mají definovaný, neměnný typ. Jsou dva druhy typů:
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Pokročilé programování v C++ (část B)
ZADÁNÍ Sestavte program, který vytiskne n hvězdiček.
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
Úvod do C# - OOP Jaroslav BURDYS 4IT.
OOP OOP (Object Oriented Programming)
OOP - Objektově Orientované Programování
Y36PJC Programování v jazyce C/C++
Generické typy jsou třídy či interfejsy deklarující tzv. typové parametry jimiž: systematizují typovou kontrolu kompilátorem, vyjadřují jasněji smysl,
Java 8: Mary Had a Little Lambda
Programování v jazyce C++
Návrhový vzor Flyweight
Tvorba objektů Objekty lze vytvářet, operovat nad nimi, ukládat je na vnější paměti, přenášet je či využívat telekomunikačně pouze v čase běhu ( run-time.
Bridge.
Reflexe jako introspekce
C# přehled vlastností.
Výčtové typy ( Java 5 ) Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí. V nejjednodušší variantě se definují příkladmo takto:
Bridge.
Transkript prezentace:

Polymorfismus = Mnohotvarost Polymorfismus umožňuje hromadně zacházet s objekty téhož nadtypu, avšak jednotlivé se objekty chovají dle své povahy dané vlastním typem. Takové objekty mohou být referovány i z heterogenního pole či kolekce anebo jako argumenty metod. Polymorfismus je založen na: - schopnosti přetypování, tj. casting. - určení vlastního typu objektu v čase běhu pomocí RTTI ( Run Time Type Identification ). - pozdní vazbě, tj. na volání metod dle vlastního typu objektu, užitím RTTI , což spotřebuje určitý čas. ( Leč: static či private či final metody se volají časnou vazbou, neboť tyto se nedědí. Kompilátor tuto vazbu fixuje, čímž volání je rychlejší. ) - zpravidla zakrytých atributech. ( Atributy jsou vázány časnou vazbou. ) PJV03

garbage collected heap int compareTo( Object o) ; Polymorfismus non-static context abstract Shape.class interface garbage collected heap Comparable.class double area( ) ; int compareTo( Object o) ; Shape[ ] s double perimeter( ) ; int compareTo( ) { } implementace komparability dle area( ) anebo perimeteru( ) Circle object Circle.class 3 double r s [ 0 ] double area( ) { PI*r*r } double perimeter( ){2*PI*r} Triangle object s [ 1 ] Triangle.class s [ 2 ] double a, b, c double area( ) { … } double perimeter( ){a+b+c} Rectangle object Rectangle.class double a, b double area( ) { a*b } double perimeter( ) {…} PJV03

Přetypování referenčních typů ( casting ) Přetypování je změna pohledu na objekt pomocí reference jiného typu. Typ objektu je neměnný - daný třídou dle níž byl zkonstruován. Přetypovat lze však jen v rámci dědičnosti, tj. pokud typ X je potomkem typu Y a Y je potomkem typu Z: Přípustnost kontroluje kompilátor. Předpokládejme: X x = new X(…); Přetypování přiřazením ( předek  potomek ): Y y = x ; ekvivalent k Y y = ( Y ) x ; Z z = y ; ekvivalent k Z z = ( Z ) y ; i k Z z = ( Z ) ( Y ) x ; Zpětné přetypování tj. casting ( potomek  předek ): y = ( Y ) z ; x = ( X ) y ; Chybným přetypováním dojde při běhu k výjimce ClassCastException. PJV03

Polymorfismus Polymorfismus je relace mezi referenčním typem a množinou objektů, které lze tímto typem referovat. Jsou-li dva typy referencí ( i nepřímo ) ve vztahu předek - potomek, pak lze potomka referovat jako předka. Jsou tři možnosti: Supertyp Subtyp Předek Potomek nadtřída  podtřída interfejs  třída nadinterfejs  podinterfejs Tím se však zúží přístup jen k těm členům ( atributům, metodám, vnitřním třídám a interfejsům ), které jsou definovány a přístupny v typu předka. PJV03

RTTI ( Run Time Type Identification ) Zjistit zda objekt patří právě k této třídě lze takto: ref.getClass( ).equals( SomeClass.class ) Zjistit zda dva objekty jsou stejného typu lze takto: ref1.getClass( ) == ref2.getClass( ) případně: ref1.getClass( ).equals( ref2.getClass( ) ) Primitivy mají také literály tříd, které jsou ekvivalenty obalových typů: boolean.class == Boolean.TYPE byte.class == Byte.TYPE int.class == Integer.TYPE .... double.class == Double.TYPE void.class == Void.TYPE PJV03

RTTI = Run Time Type Identification Každý typ objekt má referenci k jedinému objektu typu java.lang.Class, který popisuje jeho třídu. Získat tuto referenci lze dvěma způsoby: 1. SomeType ref = new SomeClass( ); Class c = ref.getClass( ); // using general method Class c = SomeType.class; // using class literal Pomocí c lze získat informace o typu a také o hodnotách atributů objektů daného typu. Takto lze získat informaci zda lze objekt referovat určitým typem, což pak umožňuje bezpečné přetypování: c.isInstance( ref ) - metoda vrací boolean ref instanceof SomeType - operátor vrací boolean PJV03

Přístup k atributům I k zastíněným atributům všech předků, lze přistupovat – pokud to dovolí jejich přístupové modifikátory. Obecná forma je: ( (Typ) ref ) . atribut Ekvivalentní formy ( kde inst resp. cls je instanční resp. třídní atribut ): Přístup k vlastnímu atributu: cls this.cls ( (Trida) this ).cls Trida.cls inst this.inst ( (Trida) this ).inst Přístup k zastíněnému atributu: super.cls ( (Predek) this ).cls Predek.cls super.inst ( (Predek) this ).inst Predek může být kterýkoli předek, super má význam přímého předka. Avšak klíčová slova this a super lze použít jen v nestatickém kontextu. Ze statického kontextu nelze přistupovat k instančním atributům. PJV03

Přístup k metodám Potomek může volat překryté metody předků (dovolí-li to jejich přístupový modifikátor ) avšak s určitým omezením pro instanční metody. Obecná forma je: ( (Typ) ref ) . metoda( … ) Ekvivalentní formy ( inst( ) resp. cls( ) je instanční resp. třídní metoda ): Volání vlastní metody: cls( ) this.cls( ) ((Trida) this).cls( ) Trida.cls( ) inst( ) this.inst( ) ((Trida) this).inst( ) Volání překryté metody předka: super.cls( ) ((Predek) this).cls( ) Predek.cls( ) super.inst( ) ((Predek) this).inst( ) <--- zavolá inst( ) Avšak klíčová slova this a super lze použít jen v nestatickém kontextu a nelze je kombinovat např. super.super či this.super . Důsledek významný pro polymorfismus: Byť je objekt referován typem některého předka zavolá se vždy instanční metoda definovaná ( tj. překrývající ) v jeho skutečném typu. PJV03

Příklad Co vytiskne následující sekvence ? A z = new B( ); System.out.print( z . i ); z . m( ); class A { int i = 1; // zastíněný atribut void m( ) { System.out.print( " A " + i ); } // překrytá metoda } class B extends A { int i = 2; // zastiňující atribut void m( ) { // překryvná metoda super . m( ); System.out.println( " B " + i ); PJV03

Řešení: 1 A 1 B 2 Object.class Halda A.class A object 1 B object non-static context static context Object.class Halda class loader A z clone( ), equals( , hashCode( ), finalize( ), getClass( ), notify( ), notifyAll( ), toString( ), wait( ) A.class A object i 1 void m( ) { print “ A ” + i ; } B object B.class i 2 void m( ) { super . m( ) ; print “ B ” + i ; } Řešení: 1 A 1 B 2 PJV03