11.5.2012
Obsah přednášky 9
Základy programování (IZAPR, IZKPR)
Skrývání informací
Základy dědičnosti, přístupová práva
Přednáška 9 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií
[email protected]
KST, FEI – IZAPR, IZKPR přednáška 9
Skrývání informací
Klient (objekt využívající uvažovaný objekt) má přímý přístup k interním datům MojeDatum
+rok : int
3
23. dubna 2012
Skrývání informací
d.setMesic(2); d.setDen(30); // setDen vrati false
+getRok() : int +setDen(int den) : boolean
d.setDen(d.getDen + 1);
+setMesic(int mesic) : boolean
// vrati false pokud neni // vypocet validni
+setRok(int rok) : boolean KST, FEI – IZAPR, IZKPR přednáška 9
4
23. dubna 2012
Zapouzdření
V tomto předmětu pouze základy zapouzdření Technik je daleko více – další informace v předmětu IOOP
Cílem je dosáhnout
Data patřící jednomu objektu jsou skryta objektům dalším Důležité je mít informace o tom, jaké operace objekt může realizovat, nikoliv jak je realizuje (rozhraní vs. implementace) Skrývání informací (information hiding) zvyšuje stupeň nezávislosti
Nezávislost modulů je důležitá pro výstavbu větších systémů a jejich údržbu
KST, FEI – IZAPR, IZKPR přednáška 9
// nespravne datum
+getMesic() : int
d.den = 32; // neplatny den d.mesic = 2; d.den = 30; // mozne, ale spatne d.den = d.den + 1; // zadne overeni platnosti
KST, FEI – IZAPR, IZKPR přednáška 9
d.setDen(32);
+getDen() : int
...
MojeDatum -mesic : int -rok : int
+mesic : int
Klient musí využívat metody pro přístup k interním datům (setters, getters) MojeDatum d = new MujDatum();
-den : int
+den : int
23. dubna 2012
Skrývání informací
Přístupné atributy objektu
2
5
23. dubna 2012
Skrýt implementační detaily třídy Nutit uživatele využívat rozhraní pro přístup k datům Lepší údržba kódu
Základní zásady
Atributy tříd mají být privátní Pouze metody zamýšlené pro používání jinými třídami mají být veřejné (public)
KST, FEI – IZAPR, IZKPR přednáška 9
6
23. dubna 2012
1
11.5.2012
Diagram tříd – jeden z diagramů jazyka UML
Umožňuje graficky dokumentovat vztah mezi třídami Neřešíme vše v jedné třídě, vytváříme nezávislé jednotky (třídy)
Diagram tříd
7
KST, FEI – IZAPR, IZKPR přednáška 9
23. dubna 2012
KST, FEI – IZAPR, IZKPR přednáška 9
8
23. dubna 2012
Asociace
Používáme v případech, kdy je pro řešení problémů vhodné použít více tříd Existuje více asociačních vazeb mezi třídami, omezíme se pouze na asociaci
Pro zjednodušení používáme pro vyjádření této vazby sloveso "má"
Další typy vazeb v předmětu IOOP (agregace, kompozice apod.)
Příklad – vazba mezi třídami DVD přehrávač a ovladač, více na cvičeních
KST, FEI – IZAPR, IZKPR přednáška 9
9
Návrh tříd, které mají společné prvky Předcházení duplicitám Nesmíme zůstat pouze u těchto motivů, jinak chyby v návrhu
Vyhledání společných prvků při splnění vazby
Pro zjednodušení používáme pro vyjádření této vazby sloveso "je" Tvar sourStredu: Souradnice zmenVelikost() otocSe()
Obdelnik
zmenVelikost() otocSe()
23. dubna 2012
Příklady:
sour: Souradnice stranaA: double stranaB: double
KST, FEI – IZAPR, IZKPR přednáška 9
Dědičnost
Motivace
10
23. dubna 2012
Dědičnost
Dědičnost
Kruznice sour: Souradnice polomer: double zmenVelikost() otocSe()
KST, FEI – IZAPR, IZKPR přednáška 9
11
Trojuhelnik sour: Souradnice stranaA: double stranaB: double stranaC: double zmenVelikost() otocSe() 23. dubna 2012
Obdelnik stranaA: double stranaB: double
Kruznice polomer: double
KST, FEI – IZAPR, IZKPR přednáška 9
12
Trojuhelnik stranaA: double stranaB: double stranaC: double 23. dubna 2012
2
11.5.2012
Dědičnost, další příklad
Dědičnost, syntaxe
Zamestnanec
Manazer
-jmeno: String -plat: double -datumNarozeni: Date
-jmeno: String -plat: double -datumNarozeni: Date -vedeOddeleni: String
+getDetails(): String
Syntaxe třídy <modifikator> class <Jmeno> [extends
] { }
+getDetails(): String
Zamestnanec -jmeno: String -plat: double -datumNarozeni: Date
Vícenásobná dědičnost s využitím slova extends není v jazyce Java povolena
Předek typu class je vždy pouze jen jeden Jiný typ vícenásobné dědičnosti (jedna třída má více předků) – rozhraní
Jeden předek může mít i více potomků – násl. příklady
+getDetails(): String
Manazer -vedeOddeleni: String
KST, FEI – IZAPR, IZKPR přednáška 9
13
KST, FEI – IZAPR, IZKPR přednáška 9
23. dubna 2012
Více úrovní dědičnosti
23. dubna 2012
Klíčové slovo abstract
Dědičnost
14
Zamestnanec
Předek – abstraktnější Potomek – konkrétnější
-jmeno: String -plat: double -datumNarozeni: Date
+getDeitals(): String Technik
Manazer
U tříd, na základě kterých nemá význam vytvářet objekty Pomocí modifikátoru abstract zamezíme vytvoření objektu Zamestnanec V diagramu tříd název -jmeno: String třídy odlišíme kurzívou -plat: double -datumNarozeni: Date
-oddeleni: String
+getDeitals(): String Technik
Sekretarka
Reditel
Manazer
-oddeleni: String
-oddeleni: String
+navysPlaty() KST, FEI – IZAPR, IZKPR přednáška 9
15
KST, FEI – IZAPR, IZKPR přednáška 9
23. dubna 2012
Dědičnost
Vztahem typu asociace (agregace, kompozice) – zjištění pomocí dotazu "má" Dědičností – zjištění pomocí dotazu "je" A Ukázka příkladu "SbirkaMedii"
B je potomkem A, B je A. C je potomkem B, C je B, C je A. Pravidlo platí napříč hierarchií dědičnosti. Opačný postup neplatí – A není B, A není C C může vše, to co A (většinou ještě víc)
KST, FEI – IZAPR, IZKPR přednáška 9
23. dubna 2012
Dědičnost, konstruktory
Důležité je rozlišovat mezi
16
17
23. dubna 2012
Konstruktory předků nejsou zděděné Jsou vždy volány
Implicitně – pokud nevoláme konstruktor předka explicitně Explicitně – klíč. slovo super
B
Pokud explicitně nevoláme, je automaticky volán implicitní konstruktor předka
C
KST, FEI – IZAPR, IZKPR přednáška 9
18
23. dubna 2012
3
11.5.2012
Klíčové slovo super, this
Vyjádření pomocí prostředků jazyka UML – diagram tříd Osoba
Přístup ke konstruktoru předka
Řetězení konstruktorů
Odkazuje na předka třídy Lze použít pro Jiný způsob neexistuje, nelze použít název konstruktoru předka super() pro přístup ke konstruktoru předka – na prvním místě v konstruktoru
Zamestnanec
Přístup k metodám předka
Klíčové slovo this(argumenty) lze použít pro volání konstruktorů ve stejné třídě
KST, FEI – IZAPR, IZKPR přednáška 9
19
23. dubna 2012
Řetězení konstruktorů public class Ucitel extends Zamestnanec { public static void main(String[] args) { new Ucitel(); }
Ucitel
KST, FEI – IZAPR, IZKPR přednáška 9
20
23. dubna 2012
Dědičnost, konstuktory Je následujícím příklad v pořádku?
1. Začátek programu
public Ucitel() { System.out.println("(4) Zavolan bezpar. konstruktor zamestnance"); }
2.Volání konstruktoru Ucitel()
public class Jablko extends Ovoce { }
class Zamestnanec extends Osoba { public Zamestnanec() { this("(2) Volani pretizeneho konstruktoru zamestnance"); System.out.println("(3) Vykonan bezparametricky konstukrot zam."); }
3.Volání konstruktoru Zamestnanec()
class Ovoce { public Ovoce(String jmeno) { System.out.println("Konstruktor tridy Ovoce"); } }
9.Vykonání příkazu
}
public Zamestnanec(String s) { System.out.println(s); }
7.Vykonání příkazu
8.Vykonání příkazu
4.Volání přetíženého konstruktoru Zamestnanec(String)
}
6.Vykonání
5.Volání konstruktoru Osoba()
class Osoba { příkazu public Osoba() { System.out.println("(1) Konstruktor tridy Osoba"); } }
KST, FEI – IZAPR, IZKPR přednáška 9
21
23. dubna 2012
Deklarace potomka
Přidávat další atributy Přidávat další metody Překrývat metody předků (overriding)
23. dubna 2012
Přístupová práva
Modifikátor
Volání metod předků
22
Přístupová práva
Potomek rozšiřuje atributy a metody předka Lze:
KST, FEI – IZAPR, IZKPR přednáška 9
V rámci třídy V rámci balíčku
Potomek
private
Ano
default
Ano
Ano
protected
Ano
Ano
Ano
public
Ano
Ano
Ano
Jiné balíčky
Ano
Klíčové slovo super s doplněním metody Např. super.vypis();
KST, FEI – IZAPR, IZKPR přednáška 9
23
23. dubna 2012
KST, FEI – IZAPR, IZKPR přednáška 9
24
23. dubna 2012
4
11.5.2012
Přístupová práva
Překrývání metod
Potomek dědí metody od předka Změna implementace metody předka potomkem Překrývání metod (method overriding)
Např. metody ve třídách CD, DVD – vypis(), budeme používat metodu toString()
Metody mohou být překryty pouze tehdy, pokud jsou dostupné Privátní metody nejsou dostupné mimo třídu, kde jsou definovány
KST, FEI – IZAPR, IZKPR přednáška 9
25
23. dubna 2012
Překrývání metod, pravidla
Proto nemohou být překryty a v takovém případě se nejedná o překryté metody, ale zcela nezávislé metody
KST, FEI – IZAPR, IZKPR přednáška 9
26
23. dubna 2012
Přetěžování vs. překrývání metod
Jedná se o překrývání, pokud je shodný
Název metody Návratový typ Seznam parametrů Přístupová práva nemohou být více restriktivní
KST, FEI – IZAPR, IZKPR přednáška 9
27
23. dubna 2012
KST, FEI – IZAPR, IZKPR přednáška 9
28
23. dubna 2012
5