JAVAScript – hermetyzacja, oddziaływanie obiektów

Transkrypt

JAVAScript – hermetyzacja, oddziaływanie obiektów
Programowanie obiektowe– ćw.9
JAVAScript – hermetyzacja, oddziaływanie obiektów
Hermetyzacja
Hermetyzacja czyli ukrywanie implementacji, enkapsulacja. Zapewnia, że obiekt nie może zmieniać swojego
stanu wewnętrznego ani stanu innych obiektów w nieoczekiwany sposób. Tylko metody obiektu są uprawnione do pokazania czy zmiany właściwości. Aby zróżnicować poziom dostępu do właściwości tworzymy właściwości prywatne i publiczne. Niektóre właściwości mogą być publiczne, to znaczy można wyświetlić ich wartość
lub je zmienić. Wyświetlenie lub zmiana właściwości prywatnej jest możliwa tylko przy użyciu metody.
<HTML><HEAD> <TITLE>PRYWATNE</TITLE></HEAD>
<BODY style="font-size:18px">
HERMETYZACJA
<PRE><SCRIPT language="javascript">
var Butelka = function (prod,poj) {
pojemnosc= poj; //właściwość prywatna
this.producent=prod; //właściwość publiczna
this.podajPojemnosc = function () {return pojemnosc; };
this.podajProducenta = function () {return this.producent; };
this.wypij = function (ile) {pojemnosc-=ile};
};
//tworzymy obiekt
b = new Butelka("Żywiec",0.5);
document.writeln("<B>Wykorzystanie własciwości</B>");
document.writeln("Pojemność:",b.pojemnosc);//nie ma dostępu do właściwości prywatnej - undefined
document.writeln("Producent:",b.producent);// jest dostęp do właściwości publicznej
document.writeln("<B>Wykorzystanie metod</B>");
document.writeln("Pojemność:",b.podajPojemnosc( ));//tylko metoda podaje właściwość prywatną
document.writeln("Producent:",b.podajProducenta( ));//metoda podaje też właściwość publiczną
//pijemy 0.2 litra
b.wypij(0.2);
document.writeln("Pojemność po wypiciu 0.2 l :", b.podajPojemnosc());
//próbujemy dolać...
b.pojemnosc+=0.1;// nic nie da bo...
document.writeln("Pojemność nadal :", b.podajPojemnosc());
//trzeba by dopisać metodę dolej( )
//zmieniamy producenta
b.producent="Tyskie";
document.writeln("Inny producent:",b.producent);//udało się
</SCRIPT></PRE></BODY></HTML>
Zadanie
Dopisać do konstruktora obiektu Butelka( ) metodę dolej(iloscDolewana) i wykorzystać w skrypcie.
Wzajemne oddziaływanie obiektów
Poniższy przykład pokazuje jak obiekty mogą wzajemnie wpływać na swoje właściwości przez odpowiednie
zdefiniowanie metod:
<HTML> <HEAD> </HEAD><BODY style="font-size:18px">
Oddziaływanie obiektów – kot gryzie ogon innemu kotu
<PRE>
<SCRIPT language="javascript">
//konstruktor
var Kot=function(imie, ogon) {
this.imie=imie;
this.ogon=ogon;
this.ugryz=function(ob){ //argumentem metody jest inny obiekt
ob.ogon -=5; //odgryzamy 5cm ogona
}
}
//tworzymy dwa obiekty
kot1= new Kot ("Maciuś",20);
kot2= new Kot ("Misiek", 20);
document.writeln(kot1.imie," ma ogon ",kot1.ogon);
document.writeln(kot2.imie," ma ogon ",kot2.ogon);
document.writeln(kot2.imie," gryzie ", kot1.imie);
//kot2 gryzie ogon kotu1
kot2.ugryz(kot1);
document.writeln(kot1.imie," ma teraz ogon: ",kot1.ogon);
document.writeln(kot1.imie," gryzie ", kot2.imie);
//kot1 gryzie ogon kotu2
kot1.ugryz(kot2);
document.writeln(kot2.imie," ma teraz ogon: ",kot2.ogon);
</SCRIPT>
</PRE></BODY></HTML>
Zadanie
Czy da się, aby kot sam sobie odgryzł ogon?
Metody statyczne
<HTML><HEAD> <TITLE></TITLE></HEAD><BODY style="font-size:18px">
Metoda statyczna
<PRE>
<SCRIPT language="javascript">
//konstruktor
var M=function(){
this.suma=function(a,b){s=a+b; return s;}
this.srednia1=function(a,b){s=(a+b)/2;return s;}
}
//konieczna instancja obiektu by korzystać z metody
var m=new M( );
document.writeln("Średnia z 4 i 6 to: ", m.srednia1(4,6));
//definujemy metodę statyczną poza definicją konstruktora
M.srednia2=function(d,e){t=(d+e)/2;return t;}
//teraz można korzystać z metody klasy bez tworzenia instancji obiektu
document.writeln("Średnia z 14 i 16 to: ",M.srednia2(14,16));
</SCRIPT>
</PRE></BODY></HTML>
Przykład tworzenia metody statycznej badającej inne obiekty:
<HTML><HEAD> <TITLE></TITLE></HEAD><BODY style="font-size:18px">
<PRE>
<SCRIPT language="javascript">
var Czlowiek = function (waga) {
this.waga = waga;
};
var Towar = function (waga) {
this.waga = waga;
};
var test = function() {
}
//metoda statyczna dla badania obiektów
test.czyCiezki=function(ob) {
if (ob.waga>100)
return "ciężki";
else
return "lekki";
}
//wykorzystanie
document.writeln(test.czyCiezki(new Czlowiek(90))); //-> lekki
document.writeln(test.czyCiezki(new Towar(110))); //-> ciężki
</SCRIPT></PRE></BODY></HTML>
Zmienna liczba argumentów
Możliwa jest dynamiczna lista argumentów konstruktora. Można wówczas tworzyć nowe obiekty poszerzając
listę argumentów, jeśli zaś nie wystąpią to nadawane są wartości domyślne. Wyjaśnia to poniższy przykład:
<HTML> <HEAD> </HEAD><BODY style="font-size:18px">
ARGUMENTY
<PRE>
<SCRIPT language="javascript">
//konstruktor
var Kot=function (nazwa){
this.nazwa= arguments[0]; //tablica argumentów – 0 to nazwa
this.ogon=arguments[1]||20; //dodatkowy argument – domyślna wartość to 20
}
kot1= new Kot("Maciuś");
document.writeln(kot1.nazwa);
document.writeln("długość ogona: ", kot1.ogon);
//teraz wykorzystamy konstruktor z dwoma argumentami
kot2= new Kot("Kitek",30);
document.writeln(kot2.nazwa);
document.writeln("długość ogona: ", kot2.ogon);
</SCRIPT></PRE></BODY></HTML>
Zadanie
Dopisać do tablicy argumentów nowy argument waga z dowolną wartością domyślną i wykorzystać przy tworzeniu egzemplarza obiektu.