Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Podobné dokumenty
Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

IRAE 07/08 Přednáška č. 1

Jazyk C# (seminář 3)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Seminář Java II p.1/43

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Generické programování

Programování v Javě I. Únor 2009

Principy objektově orientovaného programování

20. Projekt Domácí mediotéka

KTE / ZPE Informační technologie

Programování v Javě I. Leden 2008

Abstraktní třída a rozhraní

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

PREPROCESOR POKRAČOVÁNÍ

Výčtový typ strana 67

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Objektově orientované programování

Programování v C++ 2, 4. cvičení

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

PB161 Programování v jazyce C++ Přednáška 2

Projekty pro výuku programování v jazyce Java

Jazyk C# (seminář 6)

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

"Václav Klaus". public class Clovek { protected String jmeno; protected int roknarozeni; public Clovek(String j, int rn) {

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

8 Třídy, objekty, metody, předávání argumentů metod

Soubor jako posloupnost bytů

PB161 Programování v jazyce C++ Přednáška 1

Dědičnost (inheritance)

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

Třída jako datový typ. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Programování v C++ 3, 3. cvičení

UJO Framework. revoluční architektura beans. verze

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

PB161 Programování v jazyce C++ Přednáška 3

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Úvod do programovacích jazyků (Java)

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

C# - OOP (object oriented programming)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Objektové programování

Programovací jazyk Java

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Objektově orientované programování

Programování v C++ 1, 5. cvičení

Úvod do programování - Java. Cvičení č.4

JavaServer Faces Zdeněk Troníček

RMI Remote Method Invocation

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Typický prvek kolekce pro české řazení

1. Téma 12 - Textové soubory a výjimky

Java - výjimky. private void vstup() throws IOException {... }

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)

PB161 Programování v jazyce C++ Přednáška 2

Nové prvky v C# 3.0. David Keprt

Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí. Refaktorování.

Projekt Obrázek strana 135

IRAE 07/08 Přednáška č. 7. Začátek (head)

Objekty jako zapozdření dat. začneme vytvářet vlastní objekty a třídy

Programování v C++ 1, 6. cvičení

Dědění, polymorfismus

11. Dědičnost. Dědičnost strana 103

10 Balíčky, grafické znázornění tříd, základy zapozdření

Objektově orientované programování v PHP 5. Martin Klíma

PB161 Programování v jazyce C++ Přednáška 9

Jazyk C++ I. Šablony 2

Třída jako datový typ. BD6B36PJV 01 Fakulta elektrotechnická České vysoké učení technické

OOPR_05. Případové studie

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Algoritmizace a programování

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Více o konstruktorech a destruktorech

Základy objektové orientace I. Únor 2010

15. Projekt Kalkulačka

X-komponenty 3.1. Uživatelská příručka. J. Kocman, V. Trojan

3. Třídy. Základní pojmy objektového programování. Třídy

1. Programování proti rozhraní

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Android OpenGL. Pokročilé shadery

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Dynamicky vázané metody. Pozdní vazba, virtuální metody

17. Projekt Trojúhelníky

Teoretické minimum z PJV

Transkript:

Zapouzdření Tomáš Pitner, upravil Marek Šabo

Co je zapouzdření Naprosto zásadní vlastnost objektového přístupu, možná nejzásadnější Jde o spojení dat a práce s nimi do jednoho celku - objektu Data jsou v atributech objektu, práce je umožněna díky metodám objektu Data by měla být zvenčí (jinými objekty) přístupná jen prostřednictvím metod Data jsou tedy "skryta" uvnitř, zapoudřena To zajistí větší bezpečnost a robustnost, přístup k datům máme pod kontrolou Motivace zapouzdření class Person { String name; int age; Person(String inputname, int inputage) { name = inputname; age = inputage; Co když: Nechceme, aby kdokoli mohl modifikovat atributy name, age po vytvoření objektu Většinou ale chceme, aby konstruktor a třídu mohl používat každý Řešení práva přístupu Nastavíme práva přístupu pomocí modifikátorů třídy, metody nebo atributu Nechceme modifikovat atributy name, age po vytvoření objektu? použijeme klíčové slovo private Chceme, aby mohl konstruktor a třídu používat skutečně každý? použijeme klíčové slovo public 1

private String name; private int age; public Person(String inputname, int inputage) { name = inputname; age = inputage; 4 typy viditelnosti v zkratce public = veřejný, může používat každý i mimo balík používejte na třídy a (některé) metody private = soukromý, nemůže používat nikdo mimo třídy používejte na atributy protected = chráněný používá se při dědičnosti, vysvětlíme později modifikátor neuveden, pak jde o možnost přístupu "package local" v rámci balíku se chová jako public, mimo něj jako private v našem kurzu tento typ nebudeme používat Ujistěte se, že vždy máte zadefinovaný práva přístupu/typ viditelnosti. V drtivé většině budete používat public a private. Metody get & set motivace private String name; private int age; public Person(String inputname, int inputage) { name = inputname; age = inputage; Klíčové slovo public umožňuje použít třídu Person všude Person p = new Person("Marek", 23); // even from another class/package Klíčové slovo private zabraňuje získat hodnotu atributů p.name, p.age. 2

Metody get Chci získat hodnotu atributu i po vytvoření objektu, ale zabránit jeho modifikaci? Do třídy přidáme metodu, která bude veřejná a po zavolaní vrátí hodnotu atributu. public int getage() { return age; Takové metody se slangově nazývají "gettery". Mají návratovou hodnotu podle typu vraceného atributu. Název metody je vždy get + jméno atributu s velkým písmenem (getage, getname, ). Metody set Chci-li nastavit hodnotu atributu i po vytvoření objektu: public void setage(int updatedage) { age = updatedage; Metoda je veřejná a po jejím zavolaní přenastaví původní hodnotu atributu. Takové metody se slangově nazývají settery. Mají návratovou hodnotu typu void (nevrací nic). Název metody je vždy set + jméno atributu s velkým písmenem (setage, setname, ). Příklad atribut a get & set private String name; // attribute public String getname() { // its getter return name; public void setname(string newname) { // its setter name = newname; 3

Viditelnost atributů Není lepší udělat atribut public, namísto vytváření metod get a set? Není, neumíme pak řešit tyhle problémy: Co když chci jenom získat hodnotu atributu, ale zakázat modifikaci (mimo třídy)? Řešení: odstraním metodu set Chci nastavit atribut věk (v třídě Person) pouze na kladné číslo? Řešení: upravím metodu set: if (updatedage > 0) age = updatedage; Chci přidat kód provedený při získávání/nastavování hodnoty atributů? Řešení: upravím metodu get/set Gettery & settery se dají ve vývojových prostředích (NetBeans, IDEA) generovat automaticky. Využití this public void setage(int updatedage) { age = updatedage; Mohli bychom nahradit jméno parametru updatedage za age? Ano, ale jak bychom se potom dostali k atributu objektu? Použitím klíčového slova this: public void setage(int age) { this.age = age; this určuje, že jde o atribut objektu, nikoli parametr (lokální proměnnou) Korektní použití třídy I 4

private String name; public Person(String name) { this.name = name; public void writeinfo() { System.out.println("Person " + name); public String getname() { return this.name; Korektní použití třídy II Vytvoříme dvě instance (konkrétní objekty) typu Person. public class Demo { public static void main(string[] args) { Person ales = new Person("Ales"); Person beata = new Person("Beata"); ales.writeinfo(); beata.writeinfo(); String alesname = ales.getname(); // getter is used // String alesname = ales.name; // forbidden Třída Account připomenutí public class Account { private double balance; public void add(double amount) { balance += amount; public void writebalance() { System.out.println(balance); public void transferto(account whereto, double amount) { balance -= amount; // change the balance whereto.add(amount); 5

Třída Account řešení public void transferto(account whereto, double amount) { this.add(-amount); whereto.add(amount); 6