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.

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

(instance konkrétní třídy)
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Funkce Připomeňme si program pro výpočet faktoriálu:
Pole, ukazatele a odkazy
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Metody (funkce, procedury)
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
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.
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
4IT1014IT101 Pátá přednáška Datové struktury - pokračování Statické prvky třídy.
Vytvoření prvního programu
Polymorfismus Dědičnost
C++ Přednáška 3 Konstantní a statické členy tříd, ukazatel this, konstantní instance třídy Ing. Jiří Kulhánek , kat. 352, VŠB TU Ostrava 2004.
Čtvrté cvičení Objektové programování Objektový model v Javě
Větvení cykly J a v a Začínáme programovat Lucie Žoltá.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
Rudolf Pecinovský Dědění implementace Rudolf Pecinovský
Objektové programování a výjimky 2. cvičení Y36PJV, X36PJV
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Třída jako zdroj funkcionality
Objektové orientované programování Objektově orientované problémy v PHP Lukáš Masopust 2008.
Objektové programování
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 -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Rudolf Pecinovský Dědění implementace Rudolf Pecinovský
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
Počítače a programování 1
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í.
IB111 Programování a algoritmizace
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.
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:
Šesté cvičení Výjimky Balíky.
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é.
POSLOUPNOST úkol 1_41. ZADÁNÍ Sestavte program, který doplní tabulku nepřímé úměrnosti pro hodnoty proměnné x = 1, …, n. Nepřímá úměrnost je zadána uživatelem.
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ů:
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Pokročilé programování v C++ (část B)
PŘÍKAZ while úkol 1_42.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Počítače a programování 1
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
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á.
Programování v jazyce C++ Speciality jazyka C++, úvod do OOP.
Y36PJC Programování v jazyce C/C++
Úvod do C# - OOP Jaroslav BURDYS 4IT.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
OOP OOP (Object Oriented Programming)
OOP - Objektově Orientované Programování
Y36PJC Programování v jazyce C/C++
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Polymorfismus = Mnohotvarost
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Bridge.
Reflexe jako introspekce
C# přehled vlastností.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Transkript prezentace:

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 B je potomkem třídy A vytvářená třída(potomek) do sebe absorbuje datové atributy a dědí metody z jiné třídy(předek) a dále je rozšiřuje a upravuje vytvářená třída(potomek) do sebe absorbuje datové atributy a dědí metody z jiné třídy(předek) a dále je rozšiřuje a upravuje

Dědění nám v odvozené třídě umožňuje vše, co bylo v základní třídě dobré, bez dalšího úsilí ponechat vše, co bylo v základní třídě dobré, bez dalšího úsilí ponechat vše, co nám chybělo, jednoduše dodat vše, co nám chybělo, jednoduše dodat vše, co se nám nelíbilo, změnit vše, co se nám nelíbilo, změnit 1. Dědičnost není pouze jednoúrovňová – potomek nějaké třídy může mít dále své potomky 2. Java podporuje jednonásobnou dědičnost tzn., že každá třída může mít jednoho předka tzn., že každá třída může mít jednoho předka

Realizace dědičnosti public class Obdélník { public int šířka; public int výška; public Obdélník ( int šířka, int výška) { this.šířka = šířka; this.výška = výška; } public double délkaÚhlopříčky() { double pom; pom = (šířka * šířka) + (výška * výška); return Math.sqrt(pom); } public int hodnotaŠířky() { return šířka; } public class Kvádr extends Obdélník { public int hloubka; // public Kvádr(int šířka, int výška, int hloubka) { super(šířka, výška); //voláme konstruktor v rodičovské třídě this.hloubka = hloubka; } public double délkaÚhlopříčky() { double pom = super.délkaÚhlopříčky(); pom = (pom * pom) + (hloubka * hloubka); return Math.sqrt(pom); } public static void main(String[] args) { Kvádr kva = new Kvádr(6, 8, 10); System.out.println(“Úhlopříčka: "+ kva.délkaÚhlopříčky()); System.out.println(“Šířka je: " + kva.hodnotaŠířky()); System.out.println("Výška je: " + kva.výška); }

třída Kvádr bude dědit od třídy Obdélník, tzn.,že převezme její proměnné instance šířka a výška a její metodu instance hodnotaŠířky() třída Kvádr bude dědit od třídy Obdélník, tzn.,že převezme její proměnné instance šířka a výška a její metodu instance hodnotaŠířky() konstruktor Obdélník() se nedědí, ale je ze třídy Kvádr využíván. Konstruktor rodičovské třídy se volá pomocí klíčového slova super a do závorek se dají skutečné parametry konstruktoru rodičovské třídy tj. zde Obdélník() konstruktor Obdélník() se nedědí, ale je ze třídy Kvádr využíván. Konstruktor rodičovské třídy se volá pomocí klíčového slova super a do závorek se dají skutečné parametry konstruktoru rodičovské třídy tj. zde Obdélník() ve třídě Kvádr využijeme zděděné proměnné šířka, výška ze třídy Obdélník a novou proměnnou hloubka. Totéž platí i o metodách instance z rodičovské třídy. ve třídě Kvádr využijeme zděděné proměnné šířka, výška ze třídy Obdélník a novou proměnnou hloubka. Totéž platí i o metodách instance z rodičovské třídy.

ve třídě Kvádr má metoda délkaÚhlopříčky() stejné jméno jako ve třídě Obdélník a stejné formální parametry(zde žádné). Tím došlo ve třídě Kvádr překrytí(overriding, zastínění- hiding) metody délkaÚhlopříčky() deklarované ve třídě Obdélník ve třídě Kvádr má metoda délkaÚhlopříčky() stejné jméno jako ve třídě Obdélník a stejné formální parametry(zde žádné). Tím došlo ve třídě Kvádr překrytí(overriding, zastínění- hiding) metody délkaÚhlopříčky() deklarované ve třídě Obdélník pokud bychom použili stejné jméno, ale jiné formální parametry, došlo by pouze k přetížení(overloading) této metody pokud bychom použili stejné jméno, ale jiné formální parametry, došlo by pouze k přetížení(overloading) této metody překrytou metodu lze volat prostřednictvím klíčového slova super(super.délkaÚhlopříčky()) překrytou metodu lze volat prostřednictvím klíčového slova super(super.délkaÚhlopříčky())

Problémy s neimplicitními konstruktory rodičovské třídy V rodiči je konstruktor bez parametrů nebo implicitní V rodiči je konstruktor bez parametrů nebo implicitní V potomkovi může být konstruktor implicitní. Pokud ale v potomkovi konstruktor existuje,nemusí si konstruktor potomka s voláním konstruktoru rodiče dělat starosti V potomkovi může být konstruktor implicitní. Pokud ale v potomkovi konstruktor existuje,nemusí si konstruktor potomka s voláním konstruktoru rodiče dělat starosti V rodiči je konstruktor alespoň s jedním parametrem V rodiči je konstruktor alespoň s jedním parametrem Konstruktor potomka musí existovat a jako svůj první příkaz musí volat pomocí super() konstruktor rodiče Konstruktor potomka musí existovat a jako svůj první příkaz musí volat pomocí super() konstruktor rodiče class Rodič { public int i; public Rodič(int parI) { i = parI; } // public Rodič() { i = 5; } } public class Potomek extends Rodič { public Potomek() { super(8); } public static void main(String[] args) { Potomek pot = new Potomek(); }

Finální metody nechceme-li, aby bylo možno metodu překrýt, deklarujeme ji jako konečnou, pomocí klíčového slova final nechceme-li, aby bylo možno metodu překrýt, deklarujeme ji jako konečnou, pomocí klíčového slova final pokud je v rodičovské třídě metoda označena jako final, můžeme ji ve zděděné třídě přetížit, tzn. final zabrání překrytí, ale nikoliv přetížení. pokud je v rodičovské třídě metoda označena jako final, můžeme ji ve zděděné třídě přetížit, tzn. final zabrání překrytí, ale nikoliv přetížení. class Rodič { public int x; public Rodič() { x = 1; } final int getX() { return x;} } public class Potomek extends Rodič { // int getX() { return x * 2; } // chyba // int getX( int a) { return a *x; } public static void main(String[ ] args) { Potomek pot = new Potomek(); System.out.println(" Hodnota je :" + pot.getX()); }

Abstraktní metody a třídy třídu, která obsahuje alespoň jednu abstraktní metodu, musíme také deklarovat jako abstraktní, tzn., že v její deklaraci před klíčovým slovem class uvedeme modifikátor abstract třídu, která obsahuje alespoň jednu abstraktní metodu, musíme také deklarovat jako abstraktní, tzn., že v její deklaraci před klíčovým slovem class uvedeme modifikátor abstract Abstraktní třída nemůže vytvářet vlastní samostatné instance Abstraktní třída nemůže vytvářet vlastní samostatné instance ve zděděné třídě je možné vynutit naprogramování této metody použitím klíčového slova abstract u metody v rodičovské třídě ve zděděné třídě je možné vynutit naprogramování této metody použitím klíčového slova abstract u metody v rodičovské třídě abstract class Rodič { public int i; public Rodič() { i = 1; } abstract int getI(); final void setI(int novéI) { i = novéI; } } public class Potomek extends Rodič { int getI() { return i * 2; } void setI() { i = 5; } // přetížená public static void main(String[] args) { // Rodič rod = new Rodič(); // chyba Potomek pot = new Potomek(); pot.setI(3); System.out.println("Hodnota je: " + pot.getI()); pot.setI(); // přetížená System.out.println("Hodnota je: " + pot.getI()); }

Finální třídy nechceme-li aby bylo možno odvozovat od třídy potomky, deklarujeme ji jako konečnou. Před class přidáme final nechceme-li aby bylo možno odvozovat od třídy potomky, deklarujeme ji jako konečnou. Před class přidáme final třída nemůže být současně konečná a abstraktní třída nemůže být současně konečná a abstraktní finální třídy mohou být optimalizovány při překladu finální třídy mohou být optimalizovány při překladu u finálních tříd není možné využít polymorfismus u finálních tříd není možné využít polymorfismus final class Rodič { public int i; public Rodič() { i = 1; } // abstract int getI(); // chyba void setI(int novéI) { i = novéI; } }

Překrytí proměnné tak, jako je možné překrýt metodu rodičovské třídy, je možné překrýt i proměnnou této třídy tak, jako je možné překrýt metodu rodičovské třídy, je možné překrýt i proměnnou této třídy k překryté instanční proměnné se lze dostat v metodách instance pomocí klíčového slova super k překryté instanční proměnné se lze dostat v metodách instance pomocí klíčového slova super ve statických metodách není tento přístup možný, protože statické metody nemohou používat proměnné instance ve statických metodách není tento přístup možný, protože statické metody nemohou používat proměnné instance class Rodič { public int i; static public long j; } public class Potomek extends Rodič { public long i; static public int j; public Potomek(long novéI) { i = novéI; super.i = 5; } public static void main(String[] args) { Rodič.j = 6; Potomek.j = 7; }