Moduł 6 œ Kompozycja i dziedziczenie
Transkrypt
Moduł 6 œ Kompozycja i dziedziczenie
MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 59 Modu 6 – Kompozycja i dziedziczenie Zawarto jednostki Po zrealizowaniu jednostki b dziesz w stanie: wykorzystywa istniej cy kod programu, w celu jego rozszerzenia tworzy nowe klasy pochodne, na podstawie klas ju istniej cych operowa sk adowymi klas nadrz dnych grupowa pliki aplikacji w formie pakietów Wprowadzenie do zagadnie Idea programowania zorientowanego obiektowo umo liwia wielokrotne wykorzystanie istniej cego kodu programu. Dzi ki temu mo liwe jest u ycie istniej cych klas bez naruszania ich implementacji realizuj c tym samym ide programowania przyrostowego. Podej%cie obiektowe w programowaniu dostarcza mechanizmów umo liwiaj cych atwe wyra anie zwi zków poj odnosz cych si do modelowanej rzeczywisto%ci. Najcz %ciej spotykane to kompozycja oraz dziedziczenie. Kompozycja Kompozycja70 wyra a relacj „sk ada si z” lub „posiada”. Tworzona klasa sk ada si mo e z dowolnej liczby obiektów, tworzonych na podstawie istniej cych ju klas. Poni szy diagram UML ilustruje zwi zki wyst puj ce pomi dzy u ytymi klasami. Osoba - Telefon imie : String nazwisko : String telefon : Telefon wiek : int - nrTelefonu : String - lacznyCzasRozmow : int - cenaRozmowy : double + pobierzNazwisko() : String + ustawNazwisko(String) : void + zadzwon(String) : void + obliczKwoteDoZaplaty () : double + ustawCeneRozmowy (double) : void Rysunek 3. Relacja kompozycji. Poni szy kod programu zawiera definicj klasy Osoba wykorzystuj c jako pola obiekty dwóch innych klas, String oraz Telefon. 70 Kompozycja jest szczególnym przypadkiem agregacji i oznacza, i obiekty sk adowe nie mog istnie bez obiektu g ównego. MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 60 class Osoba { // deklaracja pól private private private private String imie; String nazwisko; Telefon telefon; int wiek; // kompozycja (wykorzystujemy klas+ String) // kompozycja (wykorzystujemy klas+ String) // kompozycja (wykorzystujemy klas+ Telefon) // przyk,adowy konstruktor public Osoba(String imie, String nazwisko, Telefon telefon, int wiek){ this.imie = imie; this.nazwisko = nazwisko; this.telefon = telefon; this.wiek = wiek; } // przyk,adowe metody public String pobierzNazwisko() { return nazwisko; } public void ustawNazwisko(String nazwisko) { this.nazwisko = nazwisko; } } Proces tworzenia nowego obiektu klasy Osoba wraz z obiektami zale nymi (Telefon) zosta przedstawiony poni ej: Osoba adam = new Osoba ("Adam", "Kowalski", new Telefon("823945321"), 21); Dziedziczenie W celu okre%lenia, i jedno poj cie jest uszczegó owieniem (lub uogólnieniem) innego stosowane jest dziedziczenie. Wyra a ono relacj „jest” i jest wykorzystywane wsz dzie tam, gdzie nale y wskaza , i 2 poj cia s do siebie podobne. Realizacja dziedziczenia polega na tym, i nowo tworzona klasa przejmuje wszelkie cechy i zachowania z klas ju istniej cych, dodaj c b d5 te modyfikuj c je, aby by y one bardziej wyspecjalizowane. Dzi ki temu powstaje nowa klasa, okre%lana terminem „podklasa” (ang. subclass) lub „klasa pochodna”, natomiast klasa, z której dokonano dziedziczenia to „nadklasa” (ang. superclass)71 lub „klasa bazowa”. 71 W literaturze nazwy podklasy i klasy bazowej zwi zane s równie z poj ciami dziecka (ang. child) i rodzica (ang. parent) MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 61 Telefon - nrTelefonu : String - lacznyCzasRozmow : int - cenaRozmowy : double + zadzwon(String) : void + obliczKwoteDoZaplaty() : double + ustawCeneRozmowy(double) : void TelefonStacjonarny - prefiks : String TelefonKomorkowy TelefonInternetowy - operator : String - identyfikator : String + wyslijSMS(String, String) : void + sprawdzPolaczenie() : boolean Rysunek 4. Relacja dziedziczenia ( klasa Telefon oraz klasy pochodne). Dziedziczenie w j zyku Java realizowane jest za pomoc s owa kluczowego extends72 po którym nast puje nazwa klasy, z której dziedziczone s jej sk adowe: class Student extends Osoba { // cia,o klasy (sk,adowe klasy) } Klasa Student rozszerza (dziedziczy) klas Osoba. W tym przypadku Osoba jest klas bazow , natomiast Student klas pochodn , która dziedziczy wszystkie dost pne pola i metody klasy bazowej73. W klasie pochodnej mo liwe jest: • deklarowanie nowych pól, które nie wyst puj w klasie bazowej oraz tworzenie nowych pól o takiej samej nazwie, ukrywaj c zarazem pola oryginalne z klasy bazowej74, • deklarowanie metod, które nie wyst puj w klasie bazowej oraz tworzenie nowych metod o takiej samej sygnaturze75. Rozszerzaj c mo liwo%ci przyk adowej klasy Telefon mo na na jej podstawie utworzy dwie nowe klasy: TelefonKomorkowy i TelefonStacjonarny. Klasy te posiadaj nowe cechy (np. operator, prefiks), jak i zachowania (np. wy%lij SMS). Ka da z klas posiada równie w asn implementacj metody zadzwon(String). Tworz c nowe obiekty mo na pos ugiwa si równie typem klasy bazowej (zarówno telefon stacjonarny jak i komórkowy jest przecie telefonem76). 72 Dziedziczenie w Javie jest jednokrotne (ka da klasa dziedziczy tylko z jednej klasy). Klasy, które jawnie nie posiadaj zadeklarowanego dziedziczenia (brak s owa kluczowego extends w nag ówku), domy%lnie dziedzicz z klasy Object. 73 Konstruktory nie s dziedziczone. 74 Tworzenie w klasie pochodnej pól o takiej samej nazwie jak w klasie bazowej nie jest zalecane. 75 Tworzenie w klasie pochodnej metod o takiej samej sygnaturze jak metody w klasie bazowej nazywane jest przes anianiem metod (ang. override). 76 Taki sposób tworzenia obiektów nazywany jest rzutowaniem w gór (ang. upcasting). MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 62 class TelefonKomorkowy extends Telefon { // nowe pole String operator; // konstruktor public TelefonKomorkowy (String numer, String operator) { super(numer); // wywo,anie konstruktora klasy bazowej this.operator = operator; } // nowa metoda public void wyslijSMS(String nrTelefonu, String tresc) { System.out.println ("Wysylam SMS'a o tresci: " + tresc); System.out.println ("pod numer: " + nrTelefonu); } // nowa implementacja metody zadzwon (metoda przes,oni+ta) public void zadzwon(String nrTelefonu) { System.out.println ("Dzwonie z komórki do: " + nrTelefonu); } } class TelefonStacjonarny extends Telefon { // nowe pole String prefiks; // konstruktor public TelefonStacjonarny (String numer, String prefiks) { super(numer); this.prefiks = prefiks; } // nowa implementacja metody zadzwon (metoda przes,oni+ta) public void zadzwon(String nrTelefonu) { System.out.println ("Dzwonie ze stacjonarnego do: " + nrTelefonu); } } class TelefonInternetowy extends Telefon { // nowe pole String identyfikator; // konstruktory public TelefonInternetowy (String numer, String identyfikator) { super(numer); this.identyfikator = identyfikator; } // nowa metoda public boolean sprawdzPolaczenie() { return true; } // nowa implementacja metody zadzwon (metoda przes,oni+ta) public void zadzwon(String nrTelefonu) { if(sprawdzPolaczenie()) System.out.println ("Dzwonie z internetowego do: " + nrTelefonu); else System.out.println ("Brak polaczenia z internetem"); } } public class Test { public static void main(String args[]) { Telefon Telefon Telefon Telefon } } telefonJasia = new Telefon("867312632"); komorkaMarka = new TelefonKomorkowy("606345956", "Era"); stacjonarnyKasi = new TelefonStacjonarny("125439876", "1044"); InternetowyAni = new TelefonInternetowy("146743253", "Anula7"); MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 63 Polimorfizm Zarówno kompozycja, jak i dziedziczenie, które pozwala kojarzy klasy obiektów w hierarchie klas, nale do fundamentalnych w asno%ci podej%cia obiektowego. Umo liwiaj one realizacj idei programowania przyrostowego oraz pó5niejsz szybk modyfikacj kodu programu. Tworz c obiekty na podstawie klas dziedzicz cych z innych klas, mo na jako zmienn referencyjn poda typ klasy bazowej77. Wywo uj c pó5niej odpowiednie metody kompilator Javy zadecyduje, która z nich ma zosta wykonana (na podstawie typu obiektu, na rzecz, którego s one wywo ane). Taki sposób wywo ania metod nazywany jest polimorfizmem. Poni szy przyk ad przedstawia tablic elementów klasy Telefon. Poszczególne elementy tablicy zawieraj referencje zarówno do obiektów klasy Telefon, jak równie do obiektów utworzonych na podstawie klas pochodnych (TelefonKomorkowy, TelefonStacjonarny). Telefon[] tablicaTelefonow = new Telefon[4]; tablicaTelefonow[0] tablicaTelefonow[1] tablicaTelefonow[2] tablicaTelefonow[3] = = = = new new new new Telefon("634295432"); TelefonKomorkowy("504295432", "Orange"); TelefonStacjonarny("126493042", "1033"); TelefonInternetowy("325649344", "lech23"); Wywo anie dla ka dego obiektu znajduj cego si w tablicy tablicaTelefonow metody zadzwon("112") b dzie wywo aniem polimorficznym. W zale no%ci od klasy obiektu wywo ana zostanie odpowiednia metoda. for (Telefon tel : tablicaTelefonow) tel.zadzwon("112"); Pakiety Powi zane ze sob klasy i interfejsy78 umieszczane s w jednostkach bibliotecznych zwanych pakietami (ang. package). Takie grupowanie pozwala na szybsze odnalezienie w a%ciwych klas i interfejsów, jak równie wp ywa korzystnie na przejrzysto% pisanych aplikacji. Dodatkowe zalety pakietów to m.in.: • jasne okre%lenie zwi zków/powi zaA mi dzy klasami, 79 • unikanie konfliktu nazw , 80 • mo liwo% skorzystania z dodatkowych modyfikatorów dost pu . Pakiety tworzy si poprzez u ycie w kodzie 5ród owym programu s owa kluczowego package81, po którym wyst puje nazwa pakietu82. Okre%la to lokalizacj pliku skompilowanego (.class), który musi zosta umieszczony w podanym pakiecie (folderze)83: package telefonia; package uczelnia.podstawy.narzedzia; Pakiety posiadaj tak sam struktur , jak katalogi w systemie plików (mog by równie zagnie d one). Utworzenie pakietu uczelnia.podstawy.narzedzia jest równoznaczne z utworzeniem struktury katalogów na dysku (.../uczelnia/podstawy/narzedzia). Wszystkie pliki nale ce do tego pakietu powinny znale5 si w przytoczonej lokalizacji. Korzystanie z elementów pakietu umo liwia 77 Mo na u y równie nazwy interfejsu, który dana klasa implementuje. Tematyka interfejsów zostanie omówiona w nast pnym module. 79 Pakiety umo liwiaj korzystanie z klas lub interfejsów o takiej samej nazwie ale innej strukturze (np. ró ne pakiety, taka sama nazwa klasy) 80 Modyfikator package 81 S owo package musi pojawi si jako pierwsza instrukcja programu. 82 Nazwy pakietów zawieraj tylko ma e litery i s tworzone na kilka sposobów (np. odwrotna %cie ka domeny internetowej firmy, w której powsta dany pakiet) 83 Nale y pami ta , i spoza pakietu dost p jest mo liwy tylko to elementów publicznych danego pakietu (klasy, interfejsy). Klasy, które nie okre%laj przynale no%ci do konkretnego pakietu s grupowane w tak zwany pakiet domy%lny nie posiadaj cy adnej nazwy. 78 MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 64 s owo kluczowe import, po którym wyst puje nazwa pakietu oraz nazwa klasy, b d5 te gwiazdki symbolizuj cy wszystkie klasy nale ce do wskazanego pakietu84. znak // wszystkie sk,adowe pakietów telefonia oraz uczelnia.podstawy.narzedzia sI dost+pne import telefonia.*; import uczelnia.podstawy.narzedzia.*; Nazwa pakietów dostarczanych wraz z Jav rozpoczyna si od s owa java (pakiety zwi zane ze specyfikacj j zyka) b d5 te javax (rozszerzenie specyfikacji). Poj cia dodatkowe KLASA OBJECT Object85 jest g ówn klas , z której po%rednio lub bezpo%rednio dziedzicz wszystkie klasy. Zawiera ona szereg metod u atwiaj cych operacje na obiektach. Najwa niejsze z nich to86: • clone() – tworzy kopi obiektu, • toString() – zwraca reprezentacj obiektu w formie aAcucha tekstowego, • equals(Object) – porównuje dwa obiekty, • getClass() – zwraca nazw klasy na podstawie, której powsta obiekt. Najcz %ciej u ywane to toString() oraz equals(Object), które przes aniane s pochodnych. w klasach OPERATOR INSTANCEOF Operator instanceof s u y do sprawdzenia czy dany obiekt nale y do wskazanej klasy. Przyjmuje on warto% (true lub false). W przypadku prawdy mamy pewno% , i dany obiekt nale y do wskazanej klasy lub te dowolnej podklasy. boolean sprawdzenie = telefonAni instanceof Telefon; S OWO KLUCZOWE SUPER Dost p do sk adowych klasy bazowej z klasy dziedzicz cej mo liwy jest za pomoc s owa kluczowego super. W ten sposób mo na równie odwo ywa si do konstruktorów klasy nadrz dnej87 (nie s one dziedziczone). Wywo anie konstruktora klasy bazowej musi by pierwsz instrukcj w ciele konstruktora podklasy. Pytania sprawdzaj ce 1. Czym jest kompozycja w programowaniu obiektowym? 2. Wska ró nice pomi dzy poj ciami klasa bazowa, a podklasa. 3. Jakie sk adowe klasy bazowej dziedziczy podklasa? 4. Czy ka da klasa w Javie dziedziczy z innej klasy? Czy mo e dziedziczy z wielu klas? 5. Wyja%nij poj cie polimorfizmu. 6. Jakie zadania spe nia klasa Object? Jakimi metodami dysponuje? 7. Podaj przyk ady u ycia metody toString() z klasy Object? 8. Jakie jest zadanie operatora instanceof? 84 Kompilator Javy szuka klas wykorzystuj c %cie k zbudowan ze zmiennej %rodowiskowej CLASSPATH oraz nazwy konkretnego pakietu (kropki w pakiecie zostaj zast pione znakiem /). 85 Klasa Object jest jedyn klas nie posiadaj c klasy bazowej. Znajduje si ona na szczycie hierarchii klas. 86 Pozosta e metody zwi zane s z synchronizacj w tków, generowaniem unikalnych kluczy dla obiektów oraz czyszczeniem pami ci przy usuwaniu obiektów. 87 Warto pami ta o sytuacji gdy konstruktor podklasy nie wywo uje jawnie konstruktora z klasy bazowej. W takich sytuacjach Java automatycznie wywo a konstruktor domy%lny (bezparametrowy) klasy bazowej. MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 65 9. Wska ró nice pomi dzy s owami kluczowymi this i super. 10. Wska zalety u ywania pakietów. 11. W jaki sposób mo liwe jest skorzystanie z klas znajduj cych si we wskazanym pakiecie? 12. W którym miejscu i w jaki sposób w klasie dziedzicz cej z przyk adowej klasy Radio mo liwe jest odwo anie si do konstruktora klasy bazowej o sygnaturze Radio(String)? 13. Czy mo na przes oni metod equals(Object)? Je%li tak, to jakie zadanie b dzie spe nia ta metoda? Zadania do wykonania KOMPOZYCJA Zadanie 106 – Pojazd.java Pojazd jest %rodkiem transportu u atwiaj cym przemieszczanie si . Aby by o to mo liwe, musi posiada nap d (silnik). Utwórz uproszczony model pojazdu wraz z silnikiem. Rozwi%zanie Poni szy kod programu zawiera klas reprezentuj c samochód oraz silnik pojazdu. Zwró uwag na relacje zachodz ce pomi dzy wyst puj cymi klasami. Jaki to typ relacji? MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 66 public class Pojazd { private String nazwa; private Silnik silnik; public Pojazd(String pnazwa, String ptypSilnika) { nazwa = pnazwa; silnik = new Silnik(ptypSilnika); } public void ruszaj(){ System.out.println("Wsiadam do mojego " + nazwa); silnik.zapal(); System.out.println("Ruszam - gaz do dechy... i w drog+..."); } public void zatrzymaj(){ System.out.println("Zatrzymuj+ si+ z piskiem opon..."); silnik.zgas(); System.out.println("Wychodz+ z samochodu..."); } public static void main(String[] args) { Pojazd pojazd = new Pojazd("Audi Quattro","Turbo Diesel"); pojazd.ruszaj(); pojazd.zatrzymaj(); } } class Silnik { private String typ; Silnik(String ptyp){ typ = ptyp; } public void zapal(){ System.out.println("Zapalam silnik..." + typ); } public void zgas(){ System.out.println("Gasz+ silnik..."); } public String pobierzTyp(){ return typ; } } Zadanie 107 – Restauracja.java Restauracja „Europa” sk ada si z dwóch sal – dla pal cych oraz niepal cych. Ka da sala mie%ci okre%lon liczb go%ci i wyposa ona jest w sto y, krzes a oraz telewizor. Dodatkowo sala dla pal cych posiada stó do snookera. Wykorzystuj c Jav , utwórz model restauracji oraz wszystkie jej elementy sk adowe. Utwórz przyk adowy stan sal (sala 1 – 48 miejsc, sala 2 – 32 miejsca). Dodaj losowo go%ci znajduj cych si w poszczególnych salach. Wy%wietl na konsoli informacje prezentuj ce stan rzeczywisty restauracji (liczba go%ci w ka dej sali, liczba wolnych stolików, stan zaj to%ci sto u do snookera, nazwa programu aktualnie nadawanego w TV, itp.).Wykorzystaj kompozycj oraz poznane poj cia. Wskazówka Utwórz klasy: Restauracja, Sala, Stol, Krzeslo, Telewizor, Snooker, Gosc DZIEDZICZENIE I POLIFORMIZM Zadanie 108 – Zwierzeta.java Na podwórzu gospodarskim biegaj zwierz ta domowe (pies, kot, krowa), wydaj ce odg osy. Przedstaw przy pomocy j zyka Java zaistnia sytuacj . Rozwi%zanie Poni szy kod programu zawiera rozwi zanie zadania. Zwró uwag na relacje zachodz ce pomi dzy klasami. Czy potrafisz je scharakteryzowa ? W jaki sposób wywo ywana jest metoda dajGlos()? MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 67 public class Zwierzeta { public static void main(String[] args) { Zwierze[] zwierzeta = new Zwierze[3]; zwierzeta[0] = new Pies(); zwierzeta[1] = new Kot(); zwierzeta[2] = new Krowa(); System.out.println("Rykowisko..."); for(Zwierze zwierze: zwierzeta){ zwierze.dajGlos(); } } } class Zwierze { private String nazwa; public void dajGlos(){ System.out.println("G,os zwierz+cia"); } } class Pies extends Zwierze { public void dajGlos(){ System.out.println("hau hau"); } } class Kot extends Zwierze { public void dajGlos(){ System.out.println("miau miau"); } } class Krowa extends Zwierze { public void dajGlos(){ System.out.println("muuuuu"); } } Zadanie 109 – MiniZoo.java Rodzice ma ego Kornela utworzyli na swojej posiad o%ci ma e zoo. Aktualnie przebywaj tam pandy, ma py oraz kucyki. Teo to 3 letni mi% panda. W zoo mieszka wraz ze swoimi ma ymi 5 miesi cznymi synkami Pikiem i Mikiem. Romi i Tysia to dwie 4 letnie ma pki. Inwentarz dope niaj 3 kucyki, 2 letni Gatek, 3 letni Kajtek i 5 letni Taksel. 3 razy dziennie wszystkie zwierz ta otrzymuj pokarm. Ca y czas znana jest liczebno% zoo. Je%li zoo przyjmuje nowe zwierz (lub te rodzi si jakie%), liczba zwierz t zwi ksza si . Utwórz reprezentacj zoo w postaci odpowiednich klas. Stwórz obiekty odzwierciedlaj ce ka dego mieszkaAca, jak i ca e zoo. Przedstaw w postaci metod wieczorne karmienie zwierz t oraz narodziny nowej ma pki Igi. Wy%wietl wszystkie zwierz ta wraz z ich wiekiem. Wykorzystaj dziedziczenie oraz polimorfizm. Wskazówka Niezb dne klasy: Zoo, Zwierze, Panda, Malpa, Kucyk Zadanie 110 – Punkty.java, Punkt.java Napisz program umo liwiaj cy okre%lanie oraz zmian p aszczy5nie. lokalizacji (przesuwanie) punktów na Rozwi%zanie Utwórz klas Punkt, opisuj c dowolny punkt na p aszczy5nie. Klas Punkt utwórz w oddzielnym pliku .java. MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 68 public class Punkt { private int x,y; // wspó,rz+dne punktu public Punkt(int px, int py){ x = px; y = py; } public int pobierzX(){ return x; } public int pobierzY(){ return y; } public void ustawX(int px){ x = px; } public void ustawY(int py){ y = py; } public void przesun(int dx, int dy){ x += dx; y += dy; } public String toString(){ return String.format("(%d,%d)",x,y); } } Zasadnicza cz % programu (w tym metoda main()) zawarta jest w klasie Punkty. Dokonuj c kompilacji programu wystarczy skompilowa kod zawarty w pliku Punkty.java. Ze wzgl du na wyst puj ce odwo ania, kompilacja pliku Punkt.java zostanie przeprowadzona automatycznie. public class Punkty { public static void main(String[] args) { Punkt punktA = new Punkt(3,7); Punkt punktB = new Punkt(2,11); Punkt punktC = new Punkt(6,5); System.out.print("Wspó,rz+dne punktów: "); System.out.printf("%s %s %s\n",punktA,punktB,punktC); System.out.println("Zmiana po,oRenia punktów..."); punktA.przesun(2,-1); punktB.przesun(2,-1); punktC.przesun(2,-1); System.out.print("Wspó,rz+dne punktów: "); System.out.printf("%s %s %s\n",punktA,punktB,punktC); } } Zadanie 111 – Odcinki.java, Punkt.java Napisz program okre%laj cy po o enie odcinka na p aszczy5nie, na podstawie wspó rz dnych punktów AB, a tak e okre%lanie jego d ugo%ci. Rozwi%zanie Wykorzystaj poprzednio zdefiniowan klas Punkt. MODU 6 – KOMPOZYCJA I DZIEDZICZENIE public class Odcinki { public static void main(String[] args) { Odcinek odcinek = new Odcinek( new Punkt(2,3), new Punkt(7,4) ); System.out.println(odcinek); System.out.println("Zmiana po,oRenia odcinka..."); odcinek.przesun(-1,4); System.out.println(odcinek); } } class Odcinek { private Punkt punktA,punktB; // wspó,rz+dne koSców odcinka public Odcinek(Punkt ppunktA, Punkt ppunktB){ punktA = ppunktA; punktB = ppunktB; } public double dlugosc(){ int xpunktA = punktA.pobierzX(); int ypunktA = punktA.pobierzY(); int xpunktB = punktB.pobierzX(); int ypunktB = punktB.pobierzY(); return Math.sqrt( (xpunktA-xpunktB)*(xpunktA-xpunktB) + (ypunktA-ypunktB)*(ypunktA-ypunktB) ); } public void przesun(int dx, int dy){ punktA.przesun(dx,dy); punktB.przesun(dx,dy); } public String toString(){ String opis; opis = String.format("Odcinek: A%s,B%s,", punktA,punktB); opis += String.format(" d,ugoTU %3.1f", dlugosc()); return opis; } } Zadanie 112 – Rysunek.java, Kolo.java, Prostokat.java, Punkt.java Napisz program, który umo liwi umieszczanie figur geometrycznych na p aszczy5nie. Rozwi%zanie Wykorzystaj uprzednio zdefiniowan klas Punkt. 69 MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 70 public class Rysunek { int liczbaFigur = 0; Figura[] figury; public Rysunek(int pmaxLiczbaFigur){ figury = new Figura[pmaxLiczbaFigur]; } public void dodajFigure(Figura nowaFigura){ figury[liczbaFigur++] = nowaFigura; } public void przesun(int dx, int dy){ for(int i=0; i<liczbaFigur; i++) figury[i].przesun(dx,dy); } public String toString(){ String s = ""; for(int i=0; i<liczbaFigur; i++) s += figury[i] + "\n"; return s; } public static void main(String[] args) { Rysunek rysunek = new Rysunek(8); rysunek.dodajFigure(new Kolo(new Punkt(2,5),7)); rysunek.dodajFigure(new Prostokat( new Punkt(5,2), new Punkt(5,4), new Punkt(1,4), new Punkt(1,2) )); rysunek.dodajFigure(new Kolo(new Punkt(4,1),3)); rysunek.dodajFigure(new Kolo(new Punkt(8,9),1)); rysunek.dodajFigure(new Prostokat( new Punkt(3,0), new Punkt(4,0), new Punkt(4,8), new Punkt(3,8) )); System.out.println(rysunek); System.out.println("Przesuni+cie figur..."); rysunek.przesun(3,-1); System.out.println(rysunek); } } public class Kolo extends Figura { private Punkt punktA; // Trodek ko,a private int r; // promieS public Kolo(Punkt ppunktA, int pr){ punktA = ppunktA; r = pr; } public double obliczPole(){ return Math.PI * r * r; } public double obliczObwod(){ return 2 * Math.PI * r; } public void przesun(int dx, int dy){ punktA.przesun(dx,dy); } public String toString(){ return String.format("Ko,o: A%s, r=%d, pole=%f, obwód=%f", punktA,r,obliczPole(),obliczObwod() ); } } public class Prostokat extends Figura { private Punkt punktA,punktB,punktC,punktD; // wspó,rz+dne wierzcho,ków public Prostokat(Punkt ppunktA, Punkt ppunktB, Punkt ppunktC, Punkt ppunktD) { punktA = ppunktA; punktB = ppunktB; punktC = ppunktC; punktD = ppunktD; MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 71 } // odleg,oTU pomiedzy 2 punktami private double obliczXY(Punkt pX, Punkt pY){ int xpunktA = pX.pobierzX(); int ypunktA = pX.pobierzY(); int xpunktB = pY.pobierzX(); int ypunktB = pY.pobierzY(); return Math.sqrt( (xpunktA-xpunktB)*(xpunktA-xpunktB) + (ypunktA-ypunktB)*(ypunktA-ypunktB) ); } public double obliczPole(){ double a = obliczXY(punktA,punktB); double b = obliczXY(punktA,punktD); return a*b; } public double obliczObwod(){ double a = obliczXY(punktA,punktB); double b = obliczXY(punktA,punktD); return 2*a + 2*b; } public void przesun(int dx, int dy){ punktA.przesun(dx,dy); punktB.przesun(dx,dy); punktC.przesun(dx,dy); punktD.przesun(dx,dy); } public String toString(){ return String.format("ProstokIt: A%s, B%s, C%s, D%s ", punktA,punktB,punktC,punktD) + String.format("pole=%f, obwód=%f",obliczPole(),obliczObwod()); } } Zadanie 113 – Trojkat.java, Trapez.java, Romb.java Uzupe nij program Rysunek.java o mo liwo% umieszczania na p aszczy5nie kolejnych figur geometrycznych (romb, traper oraz trójk t). Zadanie 114 – KreatorFakturVAT.java Firma Handlowa-Us uga MORINEX sp. z o.o. wdra a system komputerowy wspomagaj cy prowadzenie dzia alno%ci gospodarczej. Jednym z jego elementów jest oprogramowanie wspomagaj ce wystawianie faktur VAT. Napisz program, który realizowa b dzie podan funkcjonalno% . Rozwi%zanie Faktura VAT zawiera nast puj ce informacje: numer faktury, data sprzeda y, dane sprzedawcy (nazwa, adres, kod pocztowy, miejscowo% , NIP), dane nabywcy (nazwa, adres, kod pocztowy, miejscowo% , NIP), wykaz sprzedanych produktów (towarów i/lub us ug), czna kwota brutto do zap aty. W sk ad listy produktów wchodz towary lub us ugi. Ka dy towar charakteryzuje: nazwa towaru, jednostka miary, ilo% , cena jednostkowa netto, warto% netto, stawka VAT (3, 7 lub 22%), warto% brutto. W przypadku us ug s to: nazwa us ugi, liczba roboczogodzin, cena roboczogodziny, warto% netto, stawka VAT (7 lub 22%), warto% brutto. Gdy us uga wykonywana jest w sobot lub niedziel , cena roboczogodziny wzrasta o 50%. Ogólny schemat wyst puj cych zale no%ci przedstawiony zosta na poni szym diagramie UML: MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 72 Produkt Faktura nrTelefonu : String - Towar Us uga Rysunek 5. Diagram UML dziedziczenie dla faktury VAT. Natomiast przyk adow posta faktury przedstawiono poni ej: FAKTURA VAT nr 12321 Data sprzedaRy: 17-04-2008 SPRZEDAWCA: Firma Us,ugowo-Handlowa MORINEX ul. Koszykowa 15, 30-194 Kraków NIP 677-001-20-12 NABYWCA: Firma VENPOL SA ul. D,uga 8/7, 31-723 Kraków NIP 982-10-32-203 | Nazwa towaru/us,ugi | j.m. | cena |iloTU|wart.netto|st.VAT|wart.brutto| -------------------------------------------------------------------------| Kalosze m+skie | szt | 12,30 | 3 | 36,90 | 22 | 45,02 | | Cement | kg | 3,80 | 230 | 874,00 | 22 | 1066,28 | | MontaR instalacji | godz.| 38,00 | 7 | 266,00 | 7 | 284,62 | | ... | | | | | | | -------------------------------------------------------------------------Razem do zap,aty: 1395,92 z, METODY KLASY OBJECT Zadanie 115 – PorownanieObiektow.java System komputerowy dziekanatu uczelni zawiera dane studentów, którzy rozró niani s na podstawie numeru albumu. Warunkiem koniecznym jest zapewnienie unikalno%ci numerów (ka dy student powinien posiada ró ny nr albumu). Zaprojektuj prost klas reprezentuj c studenta (pola: imi , nazwisko, nr albumu). Utwórz przyk adowych studentów o ró nych i takich samych numerach albumu. Sprawd5, jak warto% zwraca porównanie obiektów zawieraj cych taki sam numer albumu. Wykorzystaj przes anianie metody equals(Object) do porównania obiektów oraz toString() do ich wy%wietlania. TWORZENIE PAKIETÓW Zadanie 116 – TelefonKasi.java Grupowanie klas zwi zanych z podobnymi zadaniami u atwia tworzenie aplikacji. Utwórz pakiet telefonia grupuj cy wszystkie klasy dotycz ce telefonów. Wykorzystaj pakiet importuj c z niego klasy potrzebne do utworzenia telefonu komórkowego Kasi (o numerze 503984532 w sieci Plus) oraz wy%lij z niego o SMS o tre%ci "Zadanie z pakietem wykonane", na numer 602875295. MODU 6 – KOMPOZYCJA I DZIEDZICZENIE 73 Rozwi%zanie Klasy tworz ce pakiet telefonia powinny by klasami publicznymi88. Ka dy z kodów 5ród owych jako pierwsz instrukcj musi posiada s owo kluczowe package wraz z nazw pakietu. package telefonia; public class Telefon { // cia,o klasy (sk,adowe klasy) } package telefonia; public class TelefonKomorkowy extends Telefon { // cia,o klasy (sk,adowe klasy) } package telefonia; public class TelefonStacjonarny extends Telefon { // cia,o klasy (sk,adowe klasy) } package telefonia; public class TelefonInternetowy extends Telefon { // cia,o klasy (sk,adowe klasy) } import telefonia.*; public class TelefonKasi { TelefonKomorkowy telefonKasi = new TelefonKomorkowy ("503984532","Plus"); telefonKasi.wyslijSMS("602875295","Zadanie z pakietem wykonane"); } Zadanie 117 –FlotaPojazdow.java Flota pojazdów firmy SPEED sk ada si samochodów ci arowych oraz osobowych. W%ród tych ostatnich wyst puj samochody s u bowe oraz prywatne. Liczebno% na dzieA 17-04-2008 przedstawia a si nast puj co: • 4 wywrotki Scania • 2 ci gniki siod owe MAN • 2 samochody Mercedes (s u bowe) • 3 samochody Fiat Punto (s u bowe) • 5 samochodów Ford Fiesta (prywatnych, u yczonych na potrzeby firmy) Zaprojektuj klasy odpowiadaj ce strukturze floty pojazdów w firmie SPEED wraz z przyk adowymi w a%ciwo%ciami. W zale no%ci od kategorii, umie% klasy w oddzielnych pakietach. Utwórz obiekty wg podanej specyfikacji. 88 Nazwa klasy publicznej musi by taka sama jak nazwa pliku 5ród owego. W przyk adowym rozwi zaniu ka da z klas publicznych musi posiada osobny plik 5ród owy.