JAVAScript – obiekt wewnętrzny, dziedziczenie, polimorfizm
Transkrypt
JAVAScript – obiekt wewnętrzny, dziedziczenie, polimorfizm
Programowanie obiektowe– ćw.8
JAVAScript – obiekt wewnętrzny, dziedziczenie, polimorfizm
Obiekty wewnętrzne
W przypadku konieczności uwzględnienia pewnej liczby elementów o identycznym zestawie właściwości,
wchodzących w skład definiowanego obiektu, możemy jedną z właściwości obiektu głównego zdefiniować jako
pustą tablicę, a następnie wykorzystać odpowiednią metodę do wypełniania tablicy. Elementami takiej tablicy
mogą także być obiekty (mamy wówczas możliwość zróżnicowania typów składowych obiektu). Tablica elementów może być dynamicznie wypełniana w programie (dowolna liczba jej składowych).
Pokazuje to poniższy przykład:
<HTML> <HEAD> </HEAD>
<BODY style="font-size:18px">
PROSTY OBIEKT z OBIEKTEM WEWNĘTRZNYM
<PRE>
<SCRIPT language="JavaScript">
var Ksiazka= function(nr, autor, tytul, cena)
{
this.nr=nr;
this.autor=autor;
this.tytul=tytul;
this.cena=cena;
//pusta tablica
this.tomy=[];
this.podajTom=function(nrTomu, tytulTomu, liczbaStron)
{
//umieść obiekt wewnętrzny w podanej komórce tablicy
this.tomy[nrTomu-1]={
nT: nrTomu,
tT: tytulTomu,
sT: liczbaStron
}
}
} //koniec definicji konstruktora
//tworzymy egzemplarz obiektu
k1=new Ksiazka(1,'Sienkiewicz','Trylogia',50);
//tworzymy obiektu składowe
k1.podajTom(1,"Ogniem i Mieczem", 500);
k1.podajTom(2,"Potop",600);
k1.podajTom(3,"Pan Wołodyjowski",400);
//wypisujemy nadane właściwości
document.writeln(k1.nr);
document.writeln(k1.autor);
document.writeln(k1.cena);
document.writeln(k1.tytul);
document.writeln("Tomy");
for (k=0;k<k1.tomy.length;k++)
{
document.writeln(k1.tomy[k].nT,' nazwa:',k1.tomy[k].tT,' liczba stron:',k1.tomy[k].sT);
}
</SCRIPT>
</PRE></BODY></HTML>
Zadanie
Zdefiniować obiekt garaż(adres, wymiary, tablica_aut). Napisać metodę dodawania obiektów
auto(marka, rocznik) do tablicy. W skrypcie stworzyć instancję obiektu garaż i dwa auta
składowe o pewnych właściwościach. Wypisać dane na ekranie.
Dziedziczenie obiektów
Prototyp (prototype) to specjalna właściwość obiektowa, którą posiada każdy obiekt.
Prototyp można wykorzystać do nadania dowolnej wartości (obiektowej). Prototyp oznacza obiekt, który niejawnie udostępnia swoje właściwości innym obiektom. W języku JavaScript prototyp jest tworzony oraz udostępniany każdej powstającej instancji wybranej klasy.
Gdy użytkownik pragnie odczytać właściwość, która nie jest obecna w danej instancji, jest ona wyszukiwana
w jej prototypie.
Wykorzystamy prototyp do przepisania całego obiektu nadrzędnego do obiektu podrzędnego i utworzenia
nowych właściwości obiektu potomnego.
Przykład:
<HTML> <HEAD> </HEAD><BODY STYLE="FONT-SIZE:18PX">
PROSTE DZIEDZICZENIE
<PRE>
<SCRIPT language="JavaScript">
//konstruktor przodka
var Zwierze = function(wiek)
{
this.nazwaPrzodka ='zwierzę';
this.wiek = wiek;
}
//konstruktor potomka
var Kot = function(imie, siersc)
{
this.nazwaKlasy='Kot';
this.nazwa = imie;
this.nogi = 4;
this.siersc= siersc;
}
//przepisanie do prototypu właściwości obiektu Zwierze( )
Kot.prototype = new Zwierze(4)
//nowa właściwość prototypu
Kot.prototype.glos = 'Miauuu';
//tworzymy obiekt
k= new Kot("Maciek", "ruda");
//wyświetlamy jego właściwości
document.writeln("Utworzyliśmy obiekt typu:",k.nazwaKlasy) ;// wyświetli: Kot
document.writeln("Przodek:",k.nazwaPrzodka); // wyświetli: zwierzę
document.writeln("Nazwa:",k.nazwa) ;// wyświetli: Maciek
document.writeln("Nogi:",k.nogi) ;// wyświetli: 4
document.writeln("Głos:",k.glos) ;// wyszukane w prototypie - wyświetli: Miauuu
document.writeln("Wiek:",k.wiek) ;// wyświetli: 1
document.writeln("Sierść:",k.siersc) ;// wyświetli: ruda
</SCRIPT></PRE></BODY></HTML>
Jak widzimy, możemy korzystać z właściwości i metod przodka i potomka.
UWAGA: Przy tworzeniu hierarchii obiektów należy uważnie i sensownie projektować właściwości i metody. W powyższym przykładzie wiek jest właściwością Zwierze() (każde zwierzę ma wiek i np. wagę), zaś imię,
konkretna liczba nóg, kolor sierści to już właściwości kota (nie każde zwierzę ma nogi, sierść, wydaje głos
itd.).
Zadanie
Dodać do powyższego przykładu definicję i instancję obiektu Ptak(), posiadającego przodka
Zwierze(). Wypisać dane w skrypcie.
Polimorfizm (wielopostaciowość)
Przedefiniowanie metody obiektu nadrzędnego w obiekcie potomnym nosi nazwę polimorfizmu
(wielopostaciowości).
Przykład:
<HTML> <HEAD> </HEAD><BODY style="font-size:18px"><PRE>
<SCRIPT language="JavaScript">
// konstruktor obiektu Auto( )
function Auto (x) {
this.nazwa = x;
this.podajNazwe = function( ){
document.writeln("Auto:", this.nazwa);
}
}
// konstruktor obiektu AutoSuper
function AutoSuper(n) {
//przepisanie do prototypu cech obiektu Auto( )
this.prototype = new Auto(n);
//nowa właściwość
this.prototype.turbo=" Ma turbo";
//można nadpisać (przedefiniować) metodę podajNazwe
AutoSuper.prototype.podajNazwe = function ( ) {
document.writeln("Auto-super:",this.prototype.nazwa," turbo:", this.prototype.turbo);
};
}
//tworzymy instancję obiektu Auto( )
var a1 = new Auto("MacLaren");
//wywołujemy funkcje utworzonego obiektu
a1.podajNazwe( );
// sprawdzamy istnienie właściwości turbo
if (a1.turbo==undefined)
document.writeln("To auto nie ma turbo");
//inicjalizujemy obiekt potomny
var a2 = new AutoSuper("MacLaren");
// sprawdzamy przedefiniowanie metody podajNazwe()
a2.podajNazwe( );
</SCRIPT></PRE></BODY></HTML>
Teraz mamy:
• Definicję obiektu Auto() – z metodą podajNazwe()
• Definicję obiektu potomnego AutoSuper() – z dodatkową właściwością turbo i przedefiniowaną
metodą podajNazwe().
Zadanie
1. Utworzyć definicję obiektu Figura i potomnego obiektu Prostokat. Zastanowić się na doborem właściwości i metod, np. figura może mieć współrzędne położenia na płaszczyźnie czy
kolor linii (każda figura ma), natomiast prostokąt ma konkretną liczbę boków, ich długości
(tylko cechy prostokąta). Prostokąt może mieć także kolor tła (nie każda figura ma tło, bo nie
każda figura to kontur zamknięty).
2. Utworzyć definicję obiektu Narzedzie i potomnego obiektu Mlotek.
Zadanie trudniejsze (do ćwiczeń domowych)
3. Zmodyfikować powyższe zad.1 tak, aby powstała hierarchia 3-poziomowa Figura–Wielokąt–
Czworokąt. Obiektami składowymi Wielokąta będą boki z właściwością długość (umieszczone w tablicy boków). Utworzyć kilka instancji obiektów i wypisać ich dane w skrypcie. Metoda podawania boków dla Czworokąta może być polimorficzna, zawierająca dodatkowo
ograniczenie podawania długości tylko czterech boków.