Viditelnost (práva přístupu) Tomáš Pitner, Radek Ošlejšek, Marek Šabo Základní principy OOP • Dědičnost umožňuje vztah X is Y (X je Y) mezi objekty. ◦ 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. • Polymorfismus je schopnost objektu měnit chování počas běhu. ◦ Object o = new String("String, but can be Object"). ◦ Na místo, kde je očekávána instance třídy Object, je možné dosadit instanci jakékoli její podtřídy. Odkazovaný objekt se chová podle toho, jaké třídy je instancí. • Zapouzdření je zabalení dat a metod do jedné komponenty (třídy), souvisí s viditelností objektů. ◦ Cokoli, co nemusí být viditelné, nemá být viditelné. ◦ Proč? Vede ke skrývání dat, informací. Viditelnost • 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 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 (package-private) • 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 1 Modifier Class Package Subclass (diff. package) World 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 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. 2 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.  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á! 3 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; } • 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 4