MODU 6 KOMPOZYCJA I DZIEDZICZENIE 59 Modu 6 Kompozycja i dziedziczenie Zawarto jednostki Po zrealizowaniu jednostki bdziesz w stanie: wykorzystywa istniejcy kod programu, w celu jego rozszerzenia tworzy nowe klasy pochodne, na podstawie klas ju istniejcych operowa skadowymi klas nadrzdnych grupowa pliki aplikacji w formie pakietów Wprowadzenie do zagadnie Idea programowania zorientowanego obiektowo umoliwia wielokrotne wykorzystanie istniejcego kodu programu. Dziki temu moliwe jest uycie istniejcych klas bez naruszania ich implementacji realizujc tym samym ide programowania przyrostowego. Podej%cie obiektowe w programowaniu dostarcza mechanizmów umoliwiajcych atwe wyraanie zwizków poj odnoszcych si do modelowanej rzeczywisto%ci. Najcz%ciej spotykane to kompozycja oraz dziedziczenie. Kompozycja Kompozycja 70 wyraa relacj skada si z lub posiada. Tworzona klasa skada si moe z dowolnej liczby obiektów, tworzonych na podstawie istniejcych ju klas. Poniszy diagram UML ilustruje zwizki wystpujce pomidzy uytymi klasami. Osoba - imie : String - nazwisko : String - telefon : Telefon - wiek : int + pobierznazwisko() : String + ustawnazwisko(string) : void Telefon - nrtelefonu : String - lacznyczasrozmow : int - cenarozmowy : double + zadzwon(string) : void + obliczkwotedozaplaty () : double + ustawcenerozmowy (double) : void Rysunek 3. Relacja kompozycji. Poniszy kod programu zawiera definicj klasy Osoba wykorzystujc jako pola obiekty dwóch innych klas, String oraz Telefon. 70 Kompozycja jest szczególnym przypadkiem agregacji i oznacza, i obiekty skadowe nie mog istnie bez obiektu gównego.
MODU 6 KOMPOZYCJA I DZIEDZICZENIE 60 class Osoba { // deklaracja pól private String imie; // kompozycja (wykorzystujemy klas+ String) private String nazwisko; // kompozycja (wykorzystujemy klas+ String) private Telefon telefon; // kompozycja (wykorzystujemy klas+ Telefon) private int wiek; // 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 zalenymi (Telefon) zosta przedstawiony poniej: Osoba adam = new Osoba ("Adam", "Kowalski", new Telefon("823945321"), 21); Dziedziczenie W celu okre%lenia, i jedno pojcie jest uszczegóowieniem (lub uogólnieniem) innego stosowane jest dziedziczenie. Wyraa ono relacj jest i jest wykorzystywane wszdzie tam, gdzie naley wskaza, i 2 pojcia s do siebie podobne. Realizacja dziedziczenia polega na tym, i nowo tworzona klasa przejmuje wszelkie cechy i zachowania z klas ju istniejcych, dodajc bd5 te modyfikujc je, aby byy one bardziej wyspecjalizowane. Dziki 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 zwizane s równie z pojciami 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 - operator : String + wyslijsms(string, String) : void TelefonInternetowy - identyfikator : String + sprawdzpolaczenie() : boolean Rysunek 4. Relacja dziedziczenia ( klasa Telefon oraz klasy pochodne). Dziedziczenie w jzyku Java realizowane jest za pomoc sowa kluczowego extends 72 po którym nastpuje nazwa klasy, z której dziedziczone s jej skadowe: 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 dostpne pola i metody klasy bazowej 73. W klasie pochodnej moliwe jest: deklarowanie nowych pól, które nie wystpuj w klasie bazowej oraz tworzenie nowych pól o takiej samej nazwie, ukrywajc zarazem pola oryginalne z klasy bazowej 74, deklarowanie metod, które nie wystpuj w klasie bazowej oraz tworzenie nowych metod o takiej samej sygnaturze 75. Rozszerzajc moliwo%ci przykadowej klasy Telefon mona 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). Kada z klas posiada równie wasn implementacj metody zadzwon(string). Tworzc nowe obiekty mona posugiwa si równie typem klasy bazowej (zarówno telefon stacjonarny jak i komórkowy jest przecie telefonem 76 ). 72 Dziedziczenie w Javie jest jednokrotne (kada klasa dziedziczy tylko z jednej klasy). Klasy, które jawnie nie posiadaj zadeklarowanego dziedziczenia (brak sowa 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 przesanianiem 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 telefonjasia = new Telefon("867312632"); Telefon komorkamarka = new TelefonKomorkowy("606345956", "Era"); Telefon stacjonarnykasi = new TelefonStacjonarny("125439876", "1044"); Telefon 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 wasno%ci podej%cia obiektowego. Umoliwiaj one realizacj idei programowania przyrostowego oraz pó5niejsz szybk modyfikacj kodu programu. Tworzc obiekty na podstawie klas dziedziczcych z innych klas, mona jako zmienn referencyjn poda typ klasy bazowej 77. Wywoujc pó5niej odpowiednie metody kompilator Javy zadecyduje, która z nich ma zosta wykonana (na podstawie typu obiektu, na rzecz, którego s one wywoane). Taki sposób wywoania metod nazywany jest polimorfizmem. Poniszy przykad 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] = new Telefon("634295432"); tablicatelefonow[1] = new TelefonKomorkowy("504295432", "Orange"); tablicatelefonow[2] = new TelefonStacjonarny("126493042", "1033"); tablicatelefonow[3] = new TelefonInternetowy("325649344", "lech23"); Wywoanie dla kadego obiektu znajdujcego si w tablicy tablicatelefonow metody zadzwon("112") bdzie wywoaniem polimorficznym. W zaleno%ci od klasy obiektu wywoana zostanie odpowiednia metoda. for (Telefon tel : tablicatelefonow) tel.zadzwon("112"); Pakiety Powizane ze sob klasy i interfejsy 78 umieszczane s w jednostkach bibliotecznych zwanych pakietami (ang. package). Takie grupowanie pozwala na szybsze odnalezienie wa%ciwych klas i interfejsów, jak równie wpywa korzystnie na przejrzysto% pisanych aplikacji. Dodatkowe zalety pakietów to m.in.: jasne okre%lenie zwizków/powizaa midzy klasami, unikanie konfliktu nazw 79, moliwo% skorzystania z dodatkowych modyfikatorów dostpu 80. Pakiety tworzy si poprzez uycie w kodzie 5ródowym programu sowa kluczowego package 81, po którym wystpuje nazwa pakietu 82. 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 zagniedone). Utworzenie pakietu uczelnia.podstawy.narzedzia jest równoznaczne z utworzeniem struktury katalogów na dysku (.../uczelnia/podstawy/narzedzia). Wszystkie pliki nalece do tego pakietu powinny znale5 si w przytoczonej lokalizacji. Korzystanie z elementów pakietu umoliwia 77 Mona uy równie nazwy interfejsu, który dana klasa implementuje. 78 Tematyka interfejsów zostanie omówiona w nastpnym module. 79 Pakiety umoliwiaj 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 Sowo package musi pojawi si jako pierwsza instrukcja programu. 82 Nazwy pakietów zawieraj tylko mae litery i s tworzone na kilka sposobów (np. odwrotna %cieka domeny internetowej firmy, w której powsta dany pakiet) 83 Naley pamita, i spoza pakietu dostp jest moliwy tylko to elementów publicznych danego pakietu (klasy, interfejsy). Klasy, które nie okre%laj przynaleno%ci do konkretnego pakietu s grupowane w tak zwany pakiet domy%lny nie posiadajcy adnej nazwy.
MODU 6 KOMPOZYCJA I DZIEDZICZENIE 64 sowo kluczowe import, po którym wystpuje nazwa pakietu oraz nazwa klasy, bd5 te znak gwiazdki symbolizujcy wszystkie klasy nalece do wskazanego pakietu 84. // 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 sowa java (pakiety zwizane ze specyfikacj jzyka) bd5 te javax (rozszerzenie specyfikacji). Pojcia dodatkowe KLASA OBJECT Object 85 jest gówn klas, z której po%rednio lub bezpo%rednio dziedzicz wszystkie klasy. Zawiera ona szereg metod uatwiajcych operacje na obiektach. Najwaniejsze z nich to 86 : 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 uywane to tostring() oraz equals(object), które przesaniane s w klasach pochodnych. OPERATOR INSTANCEOF Operator instanceof suy do sprawdzenia czy dany obiekt naley do wskazanej klasy. Przyjmuje on warto% (true lub false). W przypadku prawdy mamy pewno%, i dany obiekt naley do wskazanej klasy lub te dowolnej podklasy. boolean sprawdzenie = telefonani instanceof Telefon; SOWO KLUCZOWE SUPER Dostp do skadowych klasy bazowej z klasy dziedziczcej moliwy jest za pomoc sowa kluczowego super. W ten sposób mona równie odwoywa si do konstruktorów klasy nadrzdnej 87 (nie s one dziedziczone). Wywoanie konstruktora klasy bazowej musi by pierwsz instrukcj w ciele konstruktora podklasy. Pytania sprawdzajce 1. Czym jest kompozycja w programowaniu obiektowym? 2. Wska rónice pomidzy pojciami klasa bazowa, a podklasa. 3. Jakie skadowe klasy bazowej dziedziczy podklasa? 4. Czy kada klasa w Javie dziedziczy z innej klasy? Czy moe dziedziczy z wielu klas? 5. Wyja%nij pojcie polimorfizmu. 6. Jakie zadania spenia klasa Object? Jakimi metodami dysponuje? 7. Podaj przykady uycia metody tostring() z klasy Object? 8. Jakie jest zadanie operatora instanceof? 84 Kompilator Javy szuka klas wykorzystujc %ciek zbudowan ze zmiennej %rodowiskowej CLASSPATH oraz nazwy konkretnego pakietu (kropki w pakiecie zostaj zastpione znakiem /). 85 Klasa Object jest jedyn klas nie posiadajc klasy bazowej. Znajduje si ona na szczycie hierarchii klas. 86 Pozostae metody zwizane s z synchronizacj wtków, generowaniem unikalnych kluczy dla obiektów oraz czyszczeniem pamici przy usuwaniu obiektów. 87 Warto pamita o sytuacji gdy konstruktor podklasy nie wywouje jawnie konstruktora z klasy bazowej. W takich sytuacjach Java automatycznie wywoa konstruktor domy%lny (bezparametrowy) klasy bazowej.
MODU 6 KOMPOZYCJA I DZIEDZICZENIE 65 9. Wska rónice pomidzy sowami kluczowymi this i super. 10. Wska zalety uywania pakietów. 11. W jaki sposób moliwe jest skorzystanie z klas znajdujcych si we wskazanym pakiecie? 12. W którym miejscu i w jaki sposób w klasie dziedziczcej z przykadowej klasy Radio moliwe jest odwoanie si do konstruktora klasy bazowej o sygnaturze Radio(String)? 13. Czy mona przesoni metod equals(object)? Je%li tak, to jakie zadanie bdzie spenia ta metoda? Zadania do wykonania KOMPOZYCJA Zadanie 106 Pojazd.java Pojazd jest %rodkiem transportu uatwiajcym przemieszczanie si. Aby byo to moliwe, musi posiada napd (silnik). Utwórz uproszczony model pojazdu wraz z silnikiem. Rozwi%zanie Poniszy kod programu zawiera klas reprezentujc samochód oraz silnik pojazdu. Zwró uwag na relacje zachodzce pomidzy wystpujcymi 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 skada si z dwóch sal dla palcych oraz niepalcych. Kada sala mie%ci okre%lon liczb go%ci i wyposaona jest w stoy, krzesa oraz telewizor. Dodatkowo sala dla palcych posiada stó do snookera. Wykorzystujc Jav, utwórz model restauracji oraz wszystkie jej elementy skadowe. Utwórz przykadowy stan sal (sala 1 48 miejsc, sala 2 32 miejsca). Dodaj losowo go%ci znajdujcych si w poszczególnych salach. Wy%wietl na konsoli informacje prezentujce stan rzeczywisty restauracji (liczba go%ci w kadej sali, liczba wolnych stolików, stan zajto%ci stou do snookera, nazwa programu aktualnie nadawanego w TV, itp.).wykorzystaj kompozycj oraz poznane pojcia. Wskazówka Utwórz klasy: Restauracja, Sala, Stol, Krzeslo, Telewizor, Snooker, Gosc DZIEDZICZENIE I POLIFORMIZM Zadanie 108 Zwierzeta.java Na podwórzu gospodarskim biegaj zwierzta domowe (pies, kot, krowa), wydajce odgosy. Przedstaw przy pomocy jzyka Java zaistnia sytuacj. Rozwi%zanie Poniszy kod programu zawiera rozwizanie zadania. Zwró uwag na relacje zachodzce pomidzy klasami. Czy potrafisz je scharakteryzowa? W jaki sposób wywoywana 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 maego Kornela utworzyli na swojej posiado%ci mae zoo. Aktualnie przebywaj tam pandy, mapy oraz kucyki. Teo to 3 letni mi% panda. W zoo mieszka wraz ze swoimi maymi 5 miesicznymi synkami Pikiem i Mikiem. Romi i Tysia to dwie 4 letnie mapki. Inwentarz dopeniaj 3 kucyki, 2 letni Gatek, 3 letni Kajtek i 5 letni Taksel. 3 razy dziennie wszystkie zwierzta otrzymuj pokarm. Cay czas znana jest liczebno% zoo. Je%li zoo przyjmuje nowe zwierz (lub te rodzi si jakie%), liczba zwierzt zwiksza si. Utwórz reprezentacj zoo w postaci odpowiednich klas. Stwórz obiekty odzwierciedlajce kadego mieszkaaca, jak i cae zoo. Przedstaw w postaci metod wieczorne karmienie zwierzt oraz narodziny nowej mapki Igi. Wy%wietl wszystkie zwierzta wraz z ich wiekiem. Wykorzystaj dziedziczenie oraz polimorfizm. Wskazówka Niezbdne klasy: Zoo, Zwierze, Panda, Malpa, Kucyk Zadanie 110 Punkty.java, Punkt.java Napisz program umoliwiajcy okre%lanie oraz zmian lokalizacji (przesuwanie) punktów na paszczy5nie. Rozwi%zanie Utwórz klas Punkt, opisujc dowolny punkt na paszczy5nie. 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. Dokonujc kompilacji programu wystarczy skompilowa kod zawarty w pliku Punkty.java. Ze wzgldu na wystpujce odwoania, 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%lajcy pooenie odcinka na paszczy5nie, na podstawie wspórzdnych punktów AB, a take okre%lanie jego dugo%ci. Rozwi%zanie Wykorzystaj poprzednio zdefiniowan klas Punkt.
MODU 6 KOMPOZYCJA I DZIEDZICZENIE 69 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 umoliwi umieszczanie figur geometrycznych na paszczy5nie. Rozwi%zanie Wykorzystaj uprzednio zdefiniowan klas Punkt.
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 Uzupenij program Rysunek.java o moliwo% umieszczania na paszczy5nie kolejnych figur geometrycznych (romb, traper oraz trójkt). Zadanie 114 KreatorFakturVAT.java Firma Handlowa-Usuga MORINEX sp. z o.o. wdraa system komputerowy wspomagajcy prowadzenie dziaalno%ci gospodarczej. Jednym z jego elementów jest oprogramowanie wspomagajce wystawianie faktur VAT. Napisz program, który realizowa bdzie podan funkcjonalno%. Rozwi%zanie Faktura VAT zawiera nastpujce informacje: numer faktury, data sprzeday, dane sprzedawcy (nazwa, adres, kod pocztowy, miejscowo%, NIP), dane nabywcy (nazwa, adres, kod pocztowy, miejscowo%, NIP), wykaz sprzedanych produktów (towarów i/lub usug), czna kwota brutto do zapaty. W skad listy produktów wchodz towary lub usugi. Kady towar charakteryzuje: nazwa towaru, jednostka miary, ilo%, cena jednostkowa netto, warto% netto, stawka VAT (3, 7 lub 22%), warto% brutto. W przypadku usug s to: nazwa usugi, liczba roboczogodzin, cena roboczogodziny, warto% netto, stawka VAT (7 lub 22%), warto% brutto. Gdy usuga wykonywana jest w sobot lub niedziel, cena roboczogodziny wzrasta o 50%. Ogólny schemat wystpujcych zaleno%ci przedstawiony zosta na poniszym diagramie UML:
MODU 6 KOMPOZYCJA I DZIEDZICZENIE 72 Produkt Faktura - nrtelefonu : String - Towar Usuga Rysunek 5. Diagram UML dziedziczenie dla faktury VAT. Natomiast przykadow posta faktury przedstawiono poniej: 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 (kady student powinien posiada róny nr albumu). Zaprojektuj prost klas reprezentujc studenta (pola: imi, nazwisko, nr albumu). Utwórz przykadowych studentów o rónych i takich samych numerach albumu. Sprawd5, jak warto% zwraca porównanie obiektów zawierajcych taki sam numer albumu. Wykorzystaj przesanianie metody equals(object) do porównania obiektów oraz tostring() do ich wy%wietlania. TWORZENIE PAKIETÓW Zadanie 116 TelefonKasi.java Grupowanie klas zwizanych z podobnymi zadaniami uatwia tworzenie aplikacji. Utwórz pakiet telefonia grupujcy wszystkie klasy dotyczce telefonów. Wykorzystaj pakiet importujc 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 tworzce pakiet telefonia powinny by klasami publicznymi 88. Kady z kodów 5ródowych jako pierwsz instrukcj musi posiada sowo 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 skada si samochodów ciarowych oraz osobowych. W%ród tych ostatnich wystpuj samochody subowe oraz prywatne. Liczebno% na dziea 17-04-2008 przedstawiaa si nastpujco: 4 wywrotki Scania 2 cigniki siodowe MAN 2 samochody Mercedes (subowe) 3 samochody Fiat Punto (subowe) 5 samochodów Ford Fiesta (prywatnych, uyczonych na potrzeby firmy) Zaprojektuj klasy odpowiadajce strukturze floty pojazdów w firmie SPEED wraz z przykadowymi wa%ciwo%ciami. W zaleno%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ódowego. W przykadowym rozwizaniu kada z klas publicznych musi posiada osobny plik 5ródowy.