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.

Podobne dokumenty