Viditelnost (práva přístupu) Základní principy OOP • Zapouzdření • Dědičnost • Polymorfismus Dědičnost • Dědičnost umožňuje vztah X is Y (X je Y) mezi objekty, Human is LivingEntity. • Umožňuje rozšířit již existující třídu, tedy vytvořit její podtřídu (podtyp), která od svého rodiče zdědí jeho atributy a metody. Proč? • Znovupoužití kódu. Nemusíme v každé živé bytosti (člověku, psu…) znovu programovat, co už umí LivingEntity. Polymorfismus • Polymorfismus je schopnost objektu měnit vnímání počas běhu. • Object o = new String("String, but can be seen as general Object"). • Na místo, kde je očekávána instance třídy Object, je možné dosadit instanci jakékoli její podtřídy. Proč? • Kde je očekávána živá bytost LivingEntity, lze nasadit člověka Human. • V množině živých bytostí můžeme mít současně lidi i psy. Zapouzdření • Zapouzdření je zabalení dat a metod do jedné komponenty (třídy). • Zabalená "věc", objekt, nejenže soustřeďuje více položek (dat i metod), ale může některé z nich navenek skrývat. • Princip je, že Cokoli, co nemusí být viditelné, ani viditelné být nemá. Proč? • Co není vidět, nelze zneužít. Můžeme to později bez újmy odebrat či změnit. 1 Viditelnost • Co nemusí být vidět, ať vidět není. • Daná věc (atribut, metoda) v objektu je, ale ne všichni ji vidí. • Použití tříd i jejich metod a atributů lze regulovat (uvedením tzv. modifikátoru přístupu). • Nastavením správné viditelnosti jsme schopni docílit skutečného zapouzdření. • Omezení viditelnosti je kontrolováno při překladu → není-li přístup povolen, nelze program přeložit. • Metody i atributy uvnitř třídy mohou mít viditelnost stejnou jako třída nebo nižší. Typy viditelnosti / přístupu Existují čtyři možnosti: • public = veřejný • protected = chráněný • modifikátor neuveden = říká se privátní v balíku či lokální v balíku (package-private, package- local) • private = soukromý Tabulka viditelností Table 1. Access Levels table Modifier Class Package Subclass (diff. package) World public Y Y Y Y protected Y Y Y N no modifier Y Y N N private Y N N N • např. atribut typu private je viditelný pouze v rámci dané třídy  Třídy nemohou být protected! Použití typů viditelnosti v tomto kurzu public třídy/rozhraní, metody, konstanty 2 private atributy, metody, konstanty protected pravděpobně nebudeme používat, výjimečně metody, atributy package-private pravděpobně nebudeme používat Veřejný, public • Přístupné odevšad. public class Account { ... } • U třídy Account lze např. ◦ vytvořit objekt typu Account v metodě jiné třídy ◦ deklarovat podtřídu třídy Account ve stejném i jiném balíku • ne všechny vlastnosti uvnitř Account musejí vždy být veřejné • veřejné bývají obvykle některé konstruktory a některé metody • veřejné jsou typicky metody předepsané implementovaným rozhraním • třídy deklarované jako veřejné musí být umístěné do souboru s totožným názvem: Account.java Soukromý, private • Viditelné jen v rámci třídy. public class Account {   private String owner;   ...   public void add(Account another) {   another.owner; // can be accessed!   ...   } } • K atributu owner nelze přistoupit v podtřídě, pouze v dané třídě. • Pro zpřístupnění proměnné pro "vnější" potřeby je nutno použít gettery/settery. • Skrýváme konkrétní implementaci datové položky. • Např. metoda getAge() nemusí existovat jako proměnná, ale může se v případě volání spočítat. 3  Volbou private nic zásadně nepokazíme. Soukromé třídy Třídy mohou mít viditelnost private. Proč by někdo chtěl privátní třídu? public class SomeClass {   private class InnerDataStructure { ... }   // code using InnerDataStructure } • Používá se u vnořených tříd (tříd uvnitř tříd). • Mimo rozsah předmětu, nebudeme používat!  Ve stejném souboru může být libovolný počet deklarací neveřejných tříd. Není to však hezké. Lokální v balíku, package-private • Přístupné jen ze tříd stejného balíku, používá se málo. • Jsou-li podtřídy v jiném balíku, třída není přístupná! package cz.some.pkg; class Account { // package-private class // available only in cz.some.pkg } • Svazuje viditelnost s organizací do balíků (ta se může měnit častěji než např. vztah nadtřída- podtřída). • Občasné využití, když nechceme mít konstruktor private nebo rozhraní public. Chráněný, protected • Viditelnost protected , tj. přístupné jen z podtříd a tříd stejného balíku. public class Account {   // attribute can be protected (but it is better to have it private)   protected float creditLimit; 4 } • U metod tam, kde se nutně očekává použití z podtříd nebo překrývání. • Vcelku často u konstruktorů — často se volá právě ze stejné (pod)třídy. Shrnutí viditelnosti Obvykle se řídíme následujícím: metoda • obvykle public, je-li užitečná i mimo třídu či balík • protected je-li je vhodná k překrytí v případných podtřídách • jinak private atribut • obvykle private • výjimečně protected, je-li potřeba přímý přístup v podtřídě třída • obvykle public • výjimečně package-private nebo private 5