| | |
| |
|
Објектно оријентирани концепти во Јава - Втор дел |
Енкапсулација со пристапни методи
Енкапсулација = вклучување на едно нешто во друго за да вклученото не е видливо или во ООД и ООП кратко кажано „не ми кажувај како го правиш, само направи го!“.
Претходно ја модифициравме методата „skiniJabolko“ така да доколку прими поголема вредност од бројот на јаболката во јаболкницата немаше да дозволи промена на променливата „vkupnoJabolka“ бидејќи е нереално истата да влезе во минус. Но доколку некој од корисниците на нашата класа (некој друг програмер) сака да ја „добие“ таа нереална ситуација многу лесно ќе го стори тоа на следниов начин:
Jabolknica jabDrvo = new Jabolknica();
jabDrvo.vkupnoJabolka = -10;
Тука веќе ни се поставува прашањето, како да го заштитиме објектот од доделување на вредности кои немаат смисла? Решението е да особеностите ги декларираме како „private“ и да дозволиме пристап само од внатрешните методи. Еве една надградена верзија на класата Jabolknica која ја користи оваа техника:
1 package mk.com.java;
2
3 public class Jabolknica extends Drvo{
4 private int vkupnoJabolka = 0;
5
6 public void dodadiJabolko() {
7 vkupnoJabolka = vkupnoJabolka + 1;
8 }
9
10 public boolean skiniJabolko(int brojNaJabolka) {
11 if (brojNaJabolka < 0) return false;
12 if (brojNaJabolka > vkupnoJabolka) return false;
13 vkupnoJabolka = vkupnoJabolka – brojNaJabolka;
14 return true;
15 }
16
17 public int getVkupnoJabolka() {
18 return vkupnoJabolka;
19 }
20
21 public boolean setVkupnoJabolka(int brojNaVkupnoJabolka) {
22 if (brojNaVkupnoJabolka < 0) return false;
23 vkupnoJabolka = brojNaVkupnoJabolka;
24 return true;
25 }
26 }
Како што можеш да видиш во линија број 4 сега „vkupnoJabolka“ е декларирана како „private“, што значи дека до истата ќе може да се пристапи само од истата класа. Методите „dodadiJabolko“ и „skiniJabolko“ не се променети, истите имаат пристап до променливата „vkupnoJabolka“ и одлично ќе работат со веќе поставените ограничувања. За да овозможиме на надворешните класи пристап до бројот на јаболка во јаболкницата (променливата „vkupnoJabolka“) ја креиравме методата „getVkupnoJabolka“, која едноставно ја враќа вредноста на променливата. За подесување на вредноста на истата променлива ја креиравме методата „setVkupnoJabolka“ со тоа ограничување на може да се подеси број на јаболка кој е исклучиво поголем или еднаков на нула.
Овие две методи се познати како „пристапни методи“. Односно тие методи ни овозможуваат индиректен пристап до вредностите на променливите кои се декларирани како „private“. Пристапните методи се типични за добро дизајниран објект. Дури и доколку некоја променлива може да чува било каква вредност погрижи се и тие променливи да си добијат свои пристапни методи. Правејќи го тоа му овозможуваш на твојот програм да употребува една важна опција на објектно орјентираното програмирање, а тоа е енкапсулацијата.
Енкапсулација во слободен превод би значело дека внатрешната поставеност (репрезентација) на објектот е одвоена од интерфејсот кој се презенетира кон другите објекти во твојот програм. Односно, програмерот кој ја користи твојата класа треба да знае само што работи твојата метода, не и како работи. Предноста на сето тоа е дека можеш слободно да смениш некоја метода, да ја оптимизираш па дури и да го смениш целосното работење на истата без да пореметиш други делови од кодот кои ја повикуваат таа метода.
На пример, доколку сакаш да имаш примерок од секое јаболко од класата „Јabolko“ наместо да користиш целобројна вредност за чување на вкупниот број на јаболка едноставно треба да ги направиш следните промени. Наместо променливата „int vkupnoJabolka“ би ставиле некоја низа која ќе ги чува објкетите од тип „Jabolko“. Исто така методата „getVkupnoJabolka“ ќе го враќа бројот на елементи во низата. Методата „setVkupnoJabolka“ би креирала инстанци од „Jabolko“ и би ги сместувало во низата. Сите овие промени можеме да ги направиме во било кое време, а местата каде што била користена класата и овие две методи нема да има потреба да се менуваат, бидејќни нивните декларации не се променети. Моќно а? ;)
Ај да не се рече не сум дал вежба: Преправи ја класата „Drvo“ така да правилно ја енкапсулира особеноста „visina“.
|
|
|
|
|
|
| |
|
|
---|
JavaTM и Java-базираните ознаки се трговски марки или регистрирани трговски марки на Sun Microsystems, Inc. во САД и други држави. Java.com.mk никако не соработува со Sun Microsystems, Inc. Сите други трговски марки се сопственост на нивните сопственици. |
|