Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií Michael.Bazant@upce.cz 2 Přístupné atributy objektu Klient (objekt využívající uvažovaný objekt) má přímý přístup k interním datům +den : int +mesic : int +rok : int... MojeDatum d.den = 32; // neplatny den d.mesic = 2; d.den = 30; // mozne, ale spatne d.den = d.den + 1; // zadne overeni platnosti Klient musí využívat metody pro přístup k interním datům (setters, getters) -den : int -mesic : int -rok : int +getden() : int MojeDatum +getmesic() : int +getrok() : int +setden(int den) : boolean +setmesic(int mesic) : boolean +setrok(int rok) : boolean MojeDatum d = new MujDatum(); d.setden(32); // nespravne datum d.setmesic(2); d.setden(30); // setden vrati false d.setden(d.getden + 1); // vrati false pokud neni // vypocet validni 3 4 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) (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 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 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) 5 6 1
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 8 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 9 10 Motivace 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 Příklady: Obdelnik 11 Kruznice polomer: double Trojuhelnik stranac: double 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" Obdelnik 12 Tvar sourstredu: Souradnice Kruznice polomer: double Trojuhelnik stranac: double 2
, další příklad, syntaxe -vedeoddeleni: String Syntaxe třídy <modifikator> class <Jmeno> [extends <Predek>] { -vedeoddeleni: String 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 13 14 Klíčové slovo abstract Více úrovní dědičnosti Předek abstraktnější Potomek konkrétnější Technik +getdeitals(): String U tříd, na základě kterých nemá význam vytvářet objekty Pomocí modifikátoru abstract zamezíme vytvoření objektu V diagramu tříd název třídy odlišíme kurzívou +getdeitals(): String Sekretarka Reditel +navysplaty() Technik 15 16, konstruktory Důležité je rozlišovat mezi Vztahem typu asociace (agregace, kompozice) zjištění pomocí dotazu "má" í 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. B Pravidlo platí napříč hierarchií dědičnosti. Konstruktory předků nejsou zděděné Jsou vždy volány Implicitně pokud nevoláme konstruktor předka explicitně Explicitně klíč. slovo super Pokud explicitně nevoláme, je automaticky volán implicitní konstruktor předka 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) C 17 18 3
Klíčové slovo super, this Odkazuje na předka třídy Lze použít pro Přístup ke konstruktoru předka 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 Přístup k metodám předka Klíčové slovo this(argumenty) lze použít pro volání konstruktorů ve stejné třídě Řetězení konstruktorů Vyjádření pomocí prostředků jazyka UML diagram tříd Osoba Ucitel 19 20 Řetězení konstruktorů public class Ucitel extends { public static void main(string[] args) { new Ucitel(); public Ucitel() { System.out.println("(4) Zavolan bezpar. konstruktor zamestnance"); class extends Osoba { public () { this("(2) Volani pretizeneho konstruktoru zamestnance"); System.out.println("(3) Vykonan bezparametricky konstukrot zam."); public (String s) { 7. Vykonání System.out.println(s); 6. Vykonání class Osoba { public Osoba() { System.out.println("(1) Konstruktor tridy Osoba"); 9. Vykonání 8. Vykonání 1. Začátek programu 2. Volání konstruktoru Ucitel() 3. Volání konstruktoru () 4. Volání přetíženého konstruktoru (String) 5. Volání konstruktoru Osoba(), konstuktory Je následujícím příklad v pořádku? public class Jablko extends Ovoce { class Ovoce { public Ovoce(String jmeno) { System.out.println("Konstruktor tridy Ovoce"); 21 22 Deklarace potomka Potomek rozšiřuje atributy a metody předka Lze: Přidávat další atributy Přidávat další metody Překrývat metody předků (overriding) Volání metod předků Klíčové slovo super s doplněním metody Např. super.vypis(); Přístupová práva Přístupová práva Modifikátor V rámci třídy V rámci balíčku Potomek Jiné balíčky private Ano default Ano Ano protected Ano Ano Ano public Ano Ano Ano Ano 23 24 4
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 Proto nemohou být překryty a v takovém případě se nejedná o překryté metody, ale zcela nezávislé metody 25 26 Překrývání metod, pravidla 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í 27 28 5