Letní akce Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Lekce 7 - Dědičnost a polymorfismus

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Java - Aréna s bojovníky, jsme dokončili naši arénu, simulující zápas dvou bojovníků. Dnes si opět rozšíříme znalosti o objektově orientovaném programování. V úvodním tutoriálu do OOP jsme si říkali, že OOP stojí na třech základních pilířích: zapouzdření, dědičnosti a polymorfismu. Zapouzdření a používání modifikátoru private nám je již dobře známé. Dnes se podíváme na zbylé dva pilíře.

Dědičnost

Dědičnost je jedna ze základních vlastností OOP a slouží k tvoření nových datových struktur na základě starých. Vysvětleme si to na jednoduchém příkladu:

Budeme programovat informační systém. To je docela reálný příklad, abychom si však učení zpříjemnili, bude to informační systém pro správu zvířat v ZOO :) Náš systém budou používat dva typy uživatelů: uživatel a administrátor. Uživatel je běžný ošetřovatel zvířat, který bude moci upravovat informace o zvířatech, např. jejich váhu nebo rozpětí křídel. Administrátor bude moci také upravovat údaje o zvířatech a navíc zvířata přidávat a mazat z databáze. Z atributů bude mít navíc telefonní číslo, aby ho bylo možné kontaktovat v případě výpadku systému. Bylo by jistě zbytečné a nepřehledné, kdybychom si museli definovat obě třídy úplně celé, protože mnoho vlastností těchto 2 objektů je společných. Uživatel i administrátor budou mít jistě jméno, věk a budou se moci přihlásit a odhlásit. Nadefinujeme si tedy pouze třídu Uzivatel (nepůjde o funkční ukázku, dnes to bude jen teorie, programovat budeme příště):

class Uzivatel {
    private String jmeno;
    private String heslo;
    private int vek;

    public boolean prihlasit(String heslo) {
        ...
    }

    public boolean odhlasit() {
        ...
    }

    public void nastavVahu(Zvire zvire) {
        ...
    }

    ...
}

Třídu jsem jen naznačil, ale jistě si ji dokážeme dobře představit. Bez znalosti dědičnosti bychom třídu Administrator definovali asi takto:

class Administrator {
    private String jmeno;
    private String heslo;
    private int vek;
    private String telefonniCislo;

    public boolean prihlasit(String heslo) {
        ...
    }

    public boolean odhlasit() {
        ...
    }

    public void nastavVahu(Zvire zvire) {
        ...
    }

    public void pridejZvire(Zvire zvire) {

    }

    public void vymazZvire(Zvire zvire) {

    }

    ...
}

Vidíme, že máme ve třídě spoustu redundantního (duplikovaného) kódu. Jakékoli změny musíme nyní provádět v obou třídách, kód se nám velmi komplikuje. Nyní použijeme dědičnost, definujeme tedy třídu Administrator tak, aby z třídy Uzivatel dědila. Atributy a metody uživatele tedy již nemusíme znovu definovat, Java nám je do třídy sám dodá:

class Administrator extends Uzivatel
{
    private String telefonniCislo;

    public void pridejZvire(Zvire zvire) {

    }

    public void vymazZvire(Zvire zvire) {

    }

    ...
}

Vidíme, že ke zdědění jsme použili klíčové slovo "extends". V anglické literatuře najdete dědičnost pod slovem inheritance.

V příkladu výše nebudou v potomkovi přístupné privátní atributy, ale pouze atributy a metody s modifikátorem public. Private atributy a metody jsou chápány jako speciální logika konkrétní třídy, která je potomkovi utajena, i když ji vlastně používá, nemůže ji měnit. Abychom dosáhli požadovaného výsledku, použijeme nový modifikátor přístupu protected.

Protected zpřístupní atribut nebo metodu buď libovolným potomkům v jakémkoli balíčku nebo libovolným třídám v tom samém balíčku. Potomek se tedy již k atributu dostane. Jako problém může být, že atribut je zvenčí viditelný, proto se v souboru .java se třídou často používá jiné jméno balíčku, než ve kterém jsou ostatní části programu. Tento nový balíček mají společný jen související třídy (např. dědičností), z balíčku ve kterém je hlavní program potom protected atributy přístupné nebudou.

Pokud bychom chtěli atributy nebo metody zpřístupnit pouze třídě samotné a jejím potomkům, neuvedeme před ně žádný modifikátor přístupu.

Začátek třídy Uzivatel by tedy vypadal takto:

class Uzivatel {
    protected String jmeno;
    protected String heslo;
    protected int vek;

    ...

Když si nyní vytvoříme instance uživatele a administrátora, oba budou mít např. atribut jmeno a metodu prihlasit(). Java třídu Uzivatel zdědí a doplní nám automaticky všechny její atributy.

Výhody dědění jsou jasné, nemusíme opisovat oběma třídám ty samé atributy, ale stačí dopsat jen to, v čem se liší. Zbytek se podědí. Přínos je obrovský, můžeme rozšiřovat existující komponenty o nové metody a tím je znovu využívat. Nemusíme psát spousty redundantního (duplikovaného) kódu. A hlavně - když změníme jediný atribut v mateřské třídě, automaticky se tato změna všude podědí. Nedojde tedy k tomu, že bychom to museli měnit ručně u 20ti tříd a někde na to zapomněli a způsobili chybu. Jsme lidé a chybovat budeme vždy, musíme tedy používat takové programátorské postupy, abychom měli možností chybovat co nejméně.

O mateřské třídě se někdy hovoří jako o předkovi (zde Uzivatel) a o třídě, která z ní dědí, jako o potomkovi (zde Administrator). Potomek může přidávat nové metody nebo si uzpůsobovat metody z mateřské třídy (viz dále). Můžete se setkat i s pojmy nadtřída a podtřída.

Další možností, jak objektový model navrhnout, by bylo zavést mateřskou třídu Uzivatel, která by sloužila pouze k dědění. Z Uzivatel by potom dědili Osetrovatel a z něj Administrator. To by se však vyplatilo při větším počtu typů uživatelů. V takovém případě hovoříme o hierarchii tříd, budeme se tím zabývat ke konci této sekce. Náš příklad byl jednoduchý a proto nám stačily pouze 2 třídy. Existují tzv. návrhové vzory, které obsahují osvědčená schémata objektových struktur pro známé případy užití. Zájemci je naleznou popsané v sekci Návrhové vzory, je to však již pokročilejší problematika a také velmi zajímavá. V objektovém modelování se dědičnost znázorňuje graficky jako prázdná šipka směřující k předkovi. V našem případě by grafická notace vypadala takto:

Dědičnost objektů – grafická notace

Datový typ při dědičnosti

Obrovskou výhodou dědičnosti je, že když si vytvoříme proměnnou s datovým typem mateřské třídy, můžeme do ni bez problému ukládat i její potomky. Je to dané tím, že potomek obsahuje vše, co obsahuje mateřská třída, splňuje tedy "požadavky" (přesněji obsahuje rozhraní) datového typu. A k tomu má oproti mateřské třídě něco navíc. Můžeme si tedy udělat pole typu Uzivatel a v něm mít jak uživatele, tak administrátory. S proměnnou to tedy funguje takto:

Uzivatel u = new Uzivatel("Jan Novák", 33);
Administrator a = new Administrator("Josef Nový", 25);
// Nyní do uživatele uložíme administrátora:
u = a;
// Vše je v pořádku, protože uživatel je předek
// Zkusíme to opačně a dostaneme chybu:
a = u;

V Javě je mnoho konstrukcí, jak operovat s typy instancí při dědičnosti. Podrobně se na ně podíváme během seriálu, nyní si ukažme jen to, jak můžeme ověřit typ instance v proměnné:

Uzivatel u = new Administrator("Josef Nový", 25);
if (u instanceof Administrator) {
    System.out.println("Je to administrátor");
} else {
    System.out.println("Je to uživatel");
}

Pomocí operátoru instanceof se můžeme zeptat, zda je objekt daného typu. Kód výše otestuje, zda je v proměnné u uživatel nebo jeho potomek administrátor.

Jazyky, které dědičnost podporují, buď umí dědičnost jednoduchou, kde třída dědí jen z jedné třídy, nebo vícenásobnou, kde třída dědí hned z několika tříd najednou. Vícenásobná dědičnost se v praxi příliš neosvědčila, časem si řekneme proč a ukážeme si i jak ji obejít. Java podporuje pouze jednoduchou dědičnost, s vícenásobnou dědičností se můžete setkat např. v C++.

Polymorfismus

Nenechte se vystrašit příšerným názvem této techniky, protože je v jádru velmi jednoduchá. Polymorfismus umožňuje používat jednotné rozhraní pro práci s různými typy objektů. Mějme například mnoho objektů, které reprezentují nějaké geometrické útvary (kruh, čtverec, trojúhelník). Bylo by jistě přínosné a přehledné, kdybychom s nimi mohli komunikovat jednotně, ačkoli se liší. Můžeme zavést třídu GeometrickyUtvar, která by obsahovala atribut barva a metodu vykresli. Všechny geometrické tvary by potom dědily z této třídy její interface (rozhraní). Objekty kruh a čtverec se ale jistě vykreslují jinak. Polymorfismus nám umožňuje přepsat si metodu vykresli u každé podtřídy tak, aby dělala, co chceme. Rozhraní tak zůstane zachováno a my nebudeme muset přemýšlet, jak se to u onoho objektu volá.

Polymorfismus bývá často vysvětlován na obrázku se zvířaty, která mají všechna v rozhraní metodu speak(), ale každé si ji vykonává po svém.

Polymorfismus

Podstatou polymorfismu je tedy metoda nebo metody, které mají všichni potomci definované se stejnou hlavičkou, ale jiným tělem. Polymorfismus si spolu s dědičností vyzkoušíme v příští lekci, Aréna s mágem (dědičnost a polymorfismus), na bojovnících v naší aréně. Přidáme mága, který si bude metodu utoc() vykonávat po svém pomocí many, ale jinak zdědí chování a atributy bojovníka. Zvenčí tedy vůbec nepoznáme, že to není bojovník, protože bude mít stejné rozhraní. Bude to zábava :)


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
32 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Java - Aréna s bojovníky
Všechny články v sekci
Objektově orientované programování v Javě
Miniatura
Následující článek
Aréna s mágem (dědičnost a polymorfismus)
Aktivity (8)

 

 

Komentáře

Avatar
Benjibs
Člen
Avatar
Benjibs:30.6.2013 21:13

Vie niekto vysvetlit, aký je rozdiel medzi public a protected? 3-krát som to celé cítal,
ale na nic som neprisiel :(

Odpovědět  +1 30.6.2013 21:13
1 + 1 = 2
Avatar
Honza Bittner
Šupák
Avatar
Odpovídá na Benjibs
Honza Bittner:30.6.2013 21:16

zkus to počtvrté :P

Odpovědět  -5 30.6.2013 21:16
Milovník Dartu. Student FIT ČVUT. Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/...
Avatar
Homo
Člen
Avatar
Odpovídá na Benjibs
Homo:30.6.2013 21:20

V jave je protected pojaty trochu jinak nez v ostatnich jazycich, tady se to jiz resilo:
http://www.itnetwork.cz/…0e0712549367

Odpovědět  +3 30.6.2013 21:20
1010011 1000101 1011000
Avatar
Kit
Redaktor
Avatar
Odpovídá na Benjibs
Kit:30.6.2013 21:26

Protected není vidět mezi balíčky. Jedině pokud tu třídu zdědíš.

Odpovědět  +3 30.6.2013 21:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Benjibs:1.7.2013 8:59

Toto je úryvok z Tutorial Pointu:

Access Control and Inheritance:

The following rules for inherited methods are enforced:

    Methods declared public in a superclass also must be public in all subclasses.

    Methods declared protected in a superclass must either be protected or public in subclasses; they cannot be private.

    Methods declared without access control (no modifier was used) can be declared more private in subclasses.

    Methods declared private are not inherited at all, so there is no rule for them.

Dajme tomu, že mám abstraktnú triedu Vozidlo, ktorá má protected metódu nastartuj().
Keď založím triedu Auto, ktorá bude dediť od Vozidla, ako bude možné zmeniť modifikátor prístupu (zdedenej metódy nastartuj()) ?
Alebo na to, aby som zmenil modifikátor podľa zmienených pravidiel na z protectd trebárs na public, bude treba metódu reimplementovať?

Editováno 1.7.2013 8:59
Odpovědět 1.7.2013 8:59
1 + 1 = 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Benjibs
Kit:1.7.2013 9:06

Můžeš modifikátor pouze rozšířit, tzn. z protected můžeš udělat public.

Odpovědět 1.7.2013 9:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Benjibs
Kit:1.7.2013 9:16

Zkus psát programy tak, abys protected nepotřeboval. Všechny proměnné private nebo fiendly. Vnější metody public, ostatní private nebo friendly.

Odpovědět 1.7.2013 9:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Odpovídá na Kit
Benjibs:1.7.2013 9:17

Takže jediným spôsobom, ako zmeniť modifikátor niečoho v triede potomka je tú konkrétnu vec reimplementovať? (ak ide o metódu)

U premenných, neexistuje niečo takéto? :
U rodiča:

protected String meno = "Jano";

U potomka:

public meno;

A potom by k premennej meno bol public prístupú.

Odpovědět 1.7.2013 9:17
1 + 1 = 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Benjibs
Kit:1.7.2013 9:21

Jenže ty nepotřebuješ public přístup k "meno". Neměl bys ho potřebovat.

Odpovědět  +2 1.7.2013 9:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Frindt
Člen
Avatar
Jan Frindt:9.3.2015 19:53

skvelý článok, skvelo vysvetlený

Odpovědět 9.3.2015 19:53
Aj keď je najškaredší, vždy miluj svoj kód! :D
Avatar
Marcel Smolik:9.7.2015 17:11

Dědičnost je spíše evoluce protože se program vyvíjí.

 
Odpovědět  -6 9.7.2015 17:11
Avatar
srdosm
Člen
Avatar
srdosm:17.9.2015 19:18

Mám k tomu takový dotaz. Mám třídu A, která dědí z třídy B.

Dále jinde v kódu pracuji s třídou A, mám vytvořený obj ( A a = new A(); ).
Mám metodu x(B b){...}, která jak je vidět bere jako argument třídu B. Proč, když tam dám třídu A si to neporadí (například píšu "x(new A())" )? A poradilo by si to obráceně, kdybych měl metodu x(A) a cpal jí x(b)?

 
Odpovědět 17.9.2015 19:18
Avatar
B42P6
Člen
Avatar
Odpovídá na srdosm
B42P6:17.9.2015 21:25

Neviem co ti nejde tak napisem nieco z dedicnosti. Predstav si triedu A a triedu B ktora dedi z A (B ma vsetko co A a este nieco naviac).Metoda berie ako parameter instanciu triedy A cize ak jej dame B ziska to co potrebuje=A, pretoze B obsahuje to co A a este nieco naviac.Predstav si druhu Metodu ktora berie ako parameter instancou triedy B , ak jej dame A nedame jej to co potrebuje=B (B obsahuje oproti A nieco naviac). Nie som na Pc tak sorry za diakritiku.

Odpovědět 17.9.2015 21:25
'long long long' is too long for GCC
Avatar
Vít Pelc
Člen
Avatar
Vít Pelc:14.3.2016 21:52

Studuji IT na technické škole, ale musím uznat, že až díky tohoto tutoriálu v Javě jsem pochopil programování (celkově). Moc dobře vysvětleno, díky autorovi za jeho čas a energii :)

 
Odpovědět  +1 14.3.2016 21:52
Avatar
Ondřej Burda:8.12.2016 19:23

Parádně sepsaný článek o dědičnosti a polymorfismu. David Čápka zachraňuje studenty i samouky :)

Odpovědět 8.12.2016 19:23
Escape the ordinary
Avatar
Lesní Muž
Člen
Avatar
Odpovídá na Vít Pelc
Lesní Muž:27.12.2016 11:34

Tak jestli je to střední škola, tak ty jsou úplně k h :D

 
Odpovědět 27.12.2016 11:34
Avatar
Vít Pelc
Člen
Avatar
Odpovídá na Lesní Muž
Vít Pelc:29.12.2016 15:39

To teda :D. V prváku berem Visual Basic, druhým ročníkem nás provází C# a ve třetím ročníku Java. Bohužel, nejdál jsme se ve všech případech dostali k OOP, a to metody a jejich parametry.

 
Odpovědět  ±0 29.12.2016 15:39
Avatar
Lesní Muž
Člen
Avatar
Odpovídá na Vít Pelc
Lesní Muž:31.12.2016 13:21

Můj kamarád (v takovém smyslu, že se skoro vůbec nevidíme, ale to jaksi nehraje roli) chodí kamsi pod Olomouc na střední, prej že bude programátor. To, co se tam naučil za dva roky je směšné. Ptal jsem se ho aspoň na objektovou kalkulačku a tu by prý udělal, ale musel by u toho hodně hledat. Samozřejmě to není jeho chyba :D. To, co se tam naučíš se dokážeš naučit sám mnohem rychleji a nebudeš to mít zafixovaný, že je to povinnost se učit. Teď si nejsem jistý, zda je gympl lepší, mě třeba vůbec nezajímá každej potentovanej hlavonožec v biologii, elektrolýza všeho možnýho v chemii, kdo koho proklel v dějepise, ale musím se to učit. Podle toho taky vypadají mé známky, no. Bohužel staré zavedené normy platí. Taky mě dostávají kroužky programování, které jsou úplně k ničemu a jenom děckám navodí pocit, že jsou hekři. Kdybych si měl vybrat, tak bych šel možná na grafiku a mezitím samostudoval programován. Jak už jsem říkal, na programátorský škole by to byla povinnost a doma se to naučíš rychleji. Jako když momentálně studuju Norštinu, i když je Němčina užitečnější. Tu se ale učím povinně a jedem podle školskýho tempa a nerad bych, abych se učil podle jiného "algoritmu" (první tohle a tohle), než ve škole. A grafika se dá přece úžasně využít! I když se dá taky vlastně naučit samostudiem. Co to tu plácám, tahle dimenze není pro mě :D. Snad chápeš.

 
Odpovědět  +2 31.12.2016 13:21
Avatar
Lesní Muž
Člen
Avatar
Odpovídá na Lesní Muž
Lesní Muž:31.12.2016 13:28

Chybí mi tam pár dodatečných závorek a je tam i někde pravopisná chyba, ale stránka vypisuje chybu, a že nemám oprávnění si upravit vlastní komentář, rip. To s tím učením jako povinnost bude až na výšce, ale to je úplně jiná kapitola. Asi nejdůležitější, studente-vrstevníku. A gl na škole.

 
Odpovědět  +1 31.12.2016 13:28
Avatar
Vít Pelc
Člen
Avatar
Odpovídá na Lesní Muž
Vít Pelc:11.1.2017 22:37

Máš pravdu, ve škole se bere tolik zbytečných věcí dopodrobna, ale to podstatné, co člověka baví, se probere jen tak napovrch. Já jsem si třeba získal ve škole v předmětu Java náskok před ostatními jen díky toho, že jsem se doma učil tutoriály tady na webu. Jinak bych šel jako ostatní spolužáci podle (jak ty říkáš) "školního tempa".

 
Odpovědět  +1 11.1.2017 22:37
Avatar
Abe
Člen
Avatar
Odpovídá na Vít Pelc
Abe:29.1.2017 0:03

Jestli ti to přijde zlé, od nás bys asi odešel. U nás prvák nic, ve druháku kreslíme vývojáky, teď jsem ve třeťáku a programujeme v C. Za 1. pololetí jsme urazili už opravdu dlouhou cestu (ne, fakt ne) - známe pouze číselné datové typy (něco jako char nebo boolean asi není potřeba), umíme if ... else a nedávno jsme začali cykly while a do while. A to nehodnotím naše půlroční učení se html, kdy o css nebyla jediná zmínka a závěrečná práce měl být web dělaný pomocí tabulky.
Buď rád za to, co vás na škole učí. Jistě ani to nestačí, ale jinde je to ještě mnohem chudší.
PS: Jméno školy radši nezmiňuji :-D...

 
Odpovědět 29.1.2017 0:03
Avatar
Vít Pelc
Člen
Avatar
Odpovídá na Abe
Vít Pelc:29.1.2017 22:00

Tak to musí být hrozný pocit, když takhle brzdí studenty. Je to škoda, když se někdo chce vzdělávat a rozvíjet podle svého tempa, ale škola mu v tom nedává možnost. Bohužel takto je ale náš systém nastavený, nedá se nic dělat. :/ Aspoň že existuje něco jako internet a potřebné znalosti a zkušenosti můžeme dohledat právě tady. :-)

 
Odpovědět 29.1.2017 22:00
Avatar
Abe
Člen
Avatar
Odpovídá na Vít Pelc
Abe:29.1.2017 23:32

Jo, plně souhlasím. Já jsem si tehdy, když jsem na tu školu dával přihlášku, myslel, že do světa počítačů, hlavně teda co se týče tvorby programů, mě ta škola uvede dostatečně. Spletl jsem se.
Ale tak hlavně že máme ten internet... A hlavně ten náš itnetwork O:-) Díky němu si můžu jet svým tempem a to mi přece jen vyhovuje :-)

 
Odpovědět  +3 29.1.2017 23:32
Avatar
Vít Pelc
Člen
Avatar
Vít Pelc:1.2.2017 12:43

Přesně, jak říkáš. :)

 
Odpovědět 1.2.2017 12:43
Avatar
Semjacko
Člen
Avatar
Semjacko:27.2.2017 1:14

Pekne napísané len nerozumiem jednej veci. Ak máme premennú u typu Uzivatel (materská trieda) a premennú a typu Administrator (potomok) a do premennej u uložíme a (u = a), tak u je teraz typu Administrator. Prečo teda nemá nové metody, ktoré obsahuje trieda Administrator?

 
Odpovědět 27.2.2017 1:14
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Semjacko
David Čápka:27.2.2017 9:19

Ona je má, ale typ je nedovoluje volat. Dále se dozvíš jak to řešit :)

Odpovědět 27.2.2017 9:19
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Semjacko
Člen
Avatar
Odpovídá na David Čápka
Semjacko:27.2.2017 12:51

Ďakujem za odpoveď :)

 
Odpovědět 27.2.2017 12:51
Avatar
Tomáš Kala
Člen
Avatar
Tomáš Kala:22.5.2017 15:36

Proč se dědí i tel. číslo? Vždyť to nemají stejné, ne?

 
Odpovědět 22.5.2017 15:36
Avatar
Mirek Slouka
Člen
Avatar
Odpovídá na Tomáš Kala
Mirek Slouka:22.5.2017 15:48

Telefonní číslo nedědí, obsahuje ho jen poděděná třída Administrator :)

Editováno 22.5.2017 15:51
Odpovědět  +1 22.5.2017 15:48
I can explain it to you, but I can't understand it for you.
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Tomáš Kala
pocitac770:22.5.2017 17:23

Všechny atributy, co jsou ve třídách (v předkovi i potomkovi) jsou pouhými "schránkami", do kterých si konkrétní údaje teprve při vytvoření/práci s instancí doplníme, takto mi pouze říkáme, že každý administrátor bude Uživatel, který má ale kromě jména, hesla a věku i telefonní číslo

 
Odpovědět  +3 22.5.2017 17:23
Avatar
Jakub Holeček:7. března 17:14

Ahojte
Mám dotaz ohledně příkazu instanceof.
Je možné ověřit typ instance podle jména?
např.: "

if("Josef Nový" instanceof Administrator){
}

Asi je to hloupý dotaz, ale s programováním teprve začínám a tohle by se mi dost hodilo.

 
Odpovědět 7. března 17:14
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jakub Holeček
pocitac770:7. března 20:12

"Josef Nový" je hodnota typu String, protože co je v uvozovkách, to je String. Když takto používáš nějaké operátory, metody atp, tak vždy musíš uvézt tu konkrétní proměnnou, protože co je pro počítač "Josef Nový"? Pouze kus textu, nic víc. Pokud chceš vyhledat někoho toho jména a zjistit, zda je administrátor, tak to tak udělej. Pravděpodobně je budeš mít uložené v nějaké kolekci uživatelů, tak v ní vyhledej podle jména, a nalezeného uživatele zkus pomocí instanceof prozkoumat

 
Odpovědět 7. března 20:12
Avatar
Odpovídá na pocitac770
Jakub Holeček:7. března 21:22

Tak nějak jsem tušil, že to nebude tak jednoduché.
Zkusím si s tím trochu víc pohrát.
Každopádně díky za odpověď.

 
Odpovědět 7. března 21:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 33 zpráv z 33.