Politechnika Świętokrzyska w Kielcach Wydział Elektrotechniki, Automatyki i Informatyki |
---|
Laboratorium Podstaw Programowania 2 |
Lab. nr 11 |
Data wykonania ćwiczenia : 02.06.2012 |
1.Przemysław Wolski |
1. Wstęp teoretyczny
Kompozycja i dziedziczenie są dwiema technikami z zakresu programowania obiektowego pozwalającymi na wielokrotne wykorzystanie kodu. Dzięki nim możemy
tworzyć nowe klasy na podstawie już istniejących. Zanim zostaną one opisane należy przyjąć jakąś notację, która ułatwiłaby wyrażenie związków między klasami
zdefiniowanymi w programie. Taką notacją, niezależną od używanego języka programowania jest język UML (ang. Unified Modeling Language). Wbrew nazwie nie jest
to język programowania, ale graficzny sposób na przedstawienie zależności między klasami. Język ten jest stosunkowo skomplikowany. W dalszej części wykładu
będziemy posługiwać się jego wersją okrojoną, niekoniecznie zgodną ze standardem. Pojedyncza klasa w tym języku może być reprezentowana przez prostokąt
zawierający w górnej części nazwę klasy, a pozostała jego część jest wypełniona nazwami metod publicznych stanowiących tzw. interfejs klasy. Mogą tam również zostać
wymienione nazwy pól klasy, które są zadeklarowane jako publiczne.
2. Przebieg laboratorium.
Zadanie 1.
Utwórz klasę która będzie określać położenie punktu w trzech wymiarach (x,y,z). Zastosuj mechanizm dziedziczenia. Wykorzystaj klasę Punkt (stworzoną na poprzednich zajęciach) jako klasę bazową. Stwórz nowa klasę Punk3D, która będzie klasą potomną.
Klasa Punkt zawiera:
Pola:
x;
y;
Konstruktory:
bezparametrowy, ustawiający wartość wszystkich pól na 1;
dwuparametrowy, przyjmujący dwie wartości typu int;
Metody:
pobierzX;
ustawX(int wspX);
pobierzY;
ustawY(int wspY);
ustawXY(int wspX, int wspY);
wyswietlWspolrzedne;
Program lab20zad1; uses crt,LAB2,LAB4; var q:Punkt3d; begin clrscr; q.inicjuj(1,2,4); q.wyswietlWspolrzedne(q.pobierzX,q.pobierzY,q.pobierzZ); readln; end. |
Program główny . Zainicjowanie liczb. Wyświetlenie wpsółrzędnych. |
---|
unit LAB2; interface type Punkt = object x,y:integer; procedure ustawX(wX:integer); function pobierzX:integer; procedure ustawY(wY:integer); function pobierzY:integer; procedure wyswietlWspolrzedne(d,c:integer); constructor inicjuj(j,k:integer); end; implementation procedure Punkt.ustawX(wX:integer); begin x:=wX; end; function Punkt.pobierzX:integer; begin pobierzX:=x; end; procedure Punkt.ustawY(wY:integer); begin y:=wY; end; function Punkt.pobierzY:integer; begin pobierzY:=y; end; procedure Punkt.wyswietlWspolrzedne(d,c:integer); begin write('Wspolrzedne: {',d,',',c); read; end; constructor Punkt.inicjuj(j,k:integer); begin ustawX(j); ustawY(k); end; end. |
Unit LAB2 Zdefiniowanie obiektu. Poczatek implementacji modułu. Procedura ustawiająca pobrana wartość na x Funkcja pobierająca x i ustawiająca na nazwę funkcji. Procedura ustawiająca pobrana wartość na y Funkcja pobierająca y i ustawiająca na nazwę funkcji. Procedura wyświetlająca. Konstrukcja ustawiająca konkretną wartość na ustawX i ustawY. |
---|
unit LAB4; interface uses crt,LAB2; type Punkt3d=object(Punkt) private z:integer; public function pobierzZ:integer; procedure ustawZ(a:integer); procedure wyswietlWspolrzedne(d,c,f:integer); constructor inicjuj(j,k,l:integer); end; implementation constructor Punkt3d.inicjuj(j,k,l:integer); begin inherited inicjuj(j,k); ustawZ(l); end; function Punkt3d.pobierzZ:integer; begin pobierzZ:=z; end; procedure Punkt3d.ustawZ(a:integer); begin z:=a; end; procedure Punkt3d.wyswietlWspolrzedne(d,c,f:integer); begin inherited wyswietlWspolrzedne(d,c); write(',',z,'}'); end; end. |
Moduł zmieniający punkt 2d na 3d Definicja obiektu 3d. Konstruktor inicjujący punkt 3d. Procedura ustawiająca pobrana wartość na z Funkcja pobierająca z i ustawiająca na nazwę funkcji. Procedura wyświetlająca. |
---|
Zadanie 2.
Utwórz klasę Pracownik. Zastosuj mechanizm dziedziczenia. Wykorzystaj klasę Pracownik jako klasę bazową. Stwórz nowa klasę kierownik, która będzie klasą potomną.
Klasa Pracownik zawiera:
Pola:
Imie, Nazwisko, Pensja;
Konstruktory:
bezparametrowy;
trzyparametrowy.
Metody:
pobierzImie;
ustawImie;
pobierzNazwisko;
ustawnazwisko;
ustawPensje;
pobierzPensje;
drukuj;
Klasa Kierownik posiada dodatkowo:
Pole:
Premia;
Metody:
ustawPremie;
pobierzPremie;
drukuj;
Program lab20zad2; uses crt,LAB5,LAB6; var q:Kierownik; begin clrscr; q.inicjuj('Te0','Grafik',2000,500); q.drukuj(q.pobierzImie,q.pobierzNazwisko,q.pobierzPensje,q.pobierzPremie); readln; end. |
Program główny. Zainicjowanie konkretnych danych. Wyświetlenie na ekran. |
---|
Unit LAB5; interface uses crt; type Pracownik=object private imie,nazwisko:string; pensja:integer; public procedure ustawImie(i:string); function pobierzImie:string; procedure ustawNazwisko(n:string); function pobierzNazwisko:string; procedure ustawPensje(p:integer); function pobierzPensje:integer; procedure drukuj(x,y:string; z:integer); constructor inicjuj(a,b:string; c:integer); end; implementation constructor Pracownik.inicjuj(a,b:string; c:integer); begin ustawImie(a); ustawNazwisko(b); ustawPensje(c); end; procedure Pracownik.ustawImie(i:string); begin imie:=i; end; function Pracownik.pobierzImie:string; begin pobierzImie:=imie; end; procedure Pracownik.ustawNazwisko(n:string); begin Nazwisko:=n; end; function Pracownik.pobierzNazwisko:string; begin pobierzNazwisko:=Nazwisko; end; procedure Pracownik.ustawPensje(p:integer); begin Pensja:=p; end; function Pracownik.pobierzPensje:integer; begin pobierzPensje:=Pensja; end; procedure Pracownik.drukuj(x,y:string; z:integer); begin writeln(x,' ',y,' zarabia: ',z); end; end. |
Zdefiniowanie obiektu Pracownik. Konstruktor inicjujacy poszczególne pola. Procedura ustawiająca pobrana wartość na imie Funkcja pobierająca imie i ustawiająca na nazwę funkcji. Procedura ustawiająca pobrana wartość na nazwisko Funkcja pobierająca nazwisko i ustawiająca na nazwę funkcji. Procedura ustawiająca pobrana wartość na pensja Funkcja pobierająca pensja i ustawiająca na nazwę funkcji. Wyświetlenie danych. |
---|
unit LAB6; interface uses crt,LAB5; type Kierownik=object(Pracownik) private Premia:integer; public function pobierzPremie:integer; procedure ustawPremie(a:integer); procedure drukuj(x,y:string; z,d:integer); constructor inicjuj(a,b:string; c,d:integer); end; implementation constructor Kierownik.inicjuj(a,b:string; c,d:integer); begin inherited inicjuj(a,b,c); ustawPremie(d); end; procedure Kierownik.ustawPremie(a:integer); begin Premia:=a; end; function Kierownik.pobierzPremie:integer; begin pobierzPremie:=Premia; end; procedure Kierownik.drukuj(x,y:string; z,d:integer); begin inherited drukuj(x,y,z); writeln('premia wynosi: ',d); end; end. |
Zdefiniowanie obiektu Kierownik, korzystającego z modułu Pracownik. Konstruktor inicjujący Poszczególne pola. Procedura ustawiająca pobrana wartość na premia Funkcja pobierająca premia i ustawiająca na nazwę funkcji. Procedura drukująca dane na ekranie. Zastąpienie procedury drukuj + dodanie premia. |
---|
program lab11zad3; uses crt,OSOB,CIEZ,TRAM; var a,b:string; c,d,x:integer; p:Osobowe; q:Ciezarowe; r:Tramwaj; begin clrscr; writeln('Podaj marke: '); readln(a); writeln('Podaj numer rejestracyjny: '); readln(b); writeln('Podaj rok produkcji: '); readln(c); writeln('Jaki pojazd dodajesz?'); writeln('1. samochod osobowy'); writeln('2. samochod ciezarowy'); writeln('3. tramwaj'); readln(x); case x of 1: begin writeln('Podaj moc w KM'); readln(d); clrscr; p.ini(a,b,c,d); p.drukuj(p.pobierzMarke,p.pobierzRejestracje,p.pobierzDate,p.pobierzMoc); end; 2: begin writeln('Podaj ladownosc: '); readln(d); clrscr; q.ini(a,b,c,d); q.drukuj(q.pobierzMarke,q.pobierzRejestracje,q.pobierzDate,q.pobierzLadownosc); end; 3: begin writeln('Podaj ilosc miejsc: '); readln(d); clrscr; r.ini(a,b,c,d); r.drukuj(r.pobierzMarke,r.pobierzRejestracje,r.pobierzDate,r.pobierzLiczbe); end; end; repeat until keypressed; end. |
Program główny. Wczytanie marki. Wczytanie numeru rejestracyjnego. MENU Wczytanie mocy pojazdu. Wczytanie ładowności. Wczytanie ilosci miejsc. Wydrukowanie danych |
---|
unit MAIN; interface type Pojazdy = object m,r:string; da:integer; procedure ustawMarke(marka:string); function pobierzMarke:string; procedure ustawRejestracje(rejestracja:string); function pobierzRejestracje:string; procedure ustawDate(data:integer); function pobierzDate:integer; procedure drukuj(a,b:string; c:integer); constructor ini(a,b:string;c:integer); end; implementation constructor Pojazdy.ini(a,b:string;c:integer); begin ustawMarke(a); ustawRejestracje(b); ustawDate(c); end; procedure Pojazdy.ustawMarke(marka:string); begin m:=marka; end; function Pojazdy.pobierzMarke:string; begin pobierzMarke:=m; end; procedure Pojazdy.ustawRejestracje(rejestracja:string); begin r:=rejestracja; end; function Pojazdy.pobierzRejestracje:string; begin pobierzRejestracje:=r; end; procedure Pojazdy.ustawDate(data:integer); begin da:=data; end; function Pojazdy.pobierzDate:integer; begin pobierzDate:=da; end; procedure Pojazdy.drukuj(a,b:string;c:integer); begin writeln('Dane pojazdu:'); writeln('Marka: |',a); writeln('Numer rejestracyjny: |',b); writeln('Rok produkcji: |',c); end; end. |
Zdefiniowanie obiektu Pojazdy Procedura ustawiająca pobrana wartość na m Funkcja pobierająca m i ustawiająca na nazwę funkcji. Procedura ustawiająca pobrana wartość na r Funkcja pobierająca r i ustawiająca na nazwę funkcji. Procedura ustawiająca pobrana wartość na da Funkcja pobierająca da i ustawiająca na nazwę funkcji. Procedura drukująca dane na ekranie. |
---|---|
unit TRAM; interface uses crt,MAIN; type Tramwaj = object(Pojazdy) i:integer; procedure ustawLiczbe(liczba:integer); function pobierzLiczbe:integer; procedure drukuj(a,b:string; c,d:integer); constructor ini(a,b:string;c,d:integer); end; implementation constructor Tramwaj.ini(a,b:string;c,d:integer); begin inherited ini(a,b,c); ustawLiczbe(d); end; procedure Tramwaj.ustawLiczbe(liczba:integer); begin i:=liczba; end; function Tramwaj.pobierzLiczbe:integer; begin pobierzLiczbe:=i; end; procedure Tramwaj.drukuj(a,b:string;c,d:integer); begin inherited drukuj(a,b,c); writeln('Tramwaj |'); write('Ilosc miejsc: |',d); end; end. |
Zdefiniowanie obiektu Tramwaj korzystającego z modułu Pojazdy. Konstruktor inicjujący dane. Procedura ustawiająca pobrana wartość na i Funkcja pobierająca i i ustawiająca na nazwę funkcji. Procedura wyświetlająca dane. |
unit SAMO; interface uses crt,MAIN; type Samochody = object(Pojazdy) procedure drukuj(a,b:string; c:integer); constructor ini(a,b:string;c:integer); end; implementation constructor Samochody.ini(a,b:string;c:integer); begin inherited ini(a,b,c); end; procedure Samochody.drukuj(a,b:string;c:integer); begin inherited drukuj(a,b,c); write('Samochod'); end; end. |
Zdefiniowanie obiektu Samochody korzystającego z modułu Pojazdy. Zainicjowanie danych. Wyświetlenie na ekran. |
---|
unit OSOB; interface uses crt,SAMO; type Osobowe = object(Samochody) km:integer; procedure ustawMoc(moc:integer); function pobierzMoc:integer; procedure drukuj(a,b:string; c,d:integer); constructor ini(a,b:string;c,d:integer); end; implementation constructor Osobowe.ini(a,b:string;c,d:integer); begin inherited ini(a,b,c); ustawMoc(d); end; procedure Osobowe.ustawMoc(moc:integer); begin km:=moc; end; function Osobowe.pobierzMoc:integer; begin pobierzMoc:=km; end; procedure Osobowe.drukuj(a,b:string;c,d:integer); begin inherited drukuj(a,b,c); write(' osobowy |'); writeln; writeln('Moc: |',d,' KM'); end; end. |
Zdefiniowanie obiektu Osobowe korzystającego z modułu Samochody. Zainicjowanie danych. Procedura ustawiająca pobrana wartość na km Funkcja pobierająca km i ustawiająca na nazwę funkcji. Wyświetlenie danych na ekran. |
---|
unit CIEZ; interface uses crt,SAMO; type Ciezarowe = object(Samochody) kg:integer; procedure ustawLadownosc(ladownosc:integer); function pobierzLadownosc:integer; procedure drukuj(a,b:string; c,d:integer); constructor ini(a,b:string;c,d:integer); end; implementation constructor Ciezarowe.ini(a,b:string;c,d:integer); begin inherited ini(a,b,c); ustawLadownosc(d); end; procedure Ciezarowe.ustawLadownosc(ladownosc:integer); begin kg:=ladownosc; end; function Ciezarowe.pobierzLadownosc:integer; begin pobierzLadownosc:=kg; end; procedure Ciezarowe.drukuj(a,b:string;c,d:integer); begin inherited drukuj(a,b,c); write(' ciezarowy |'); writeln; writeln('Ladownosc : |',d,' kg'); writeln; end; end. |
Zdefiniowanie obiektu Ciężarowe, korzystającego z modułu Samochody. Zainicjowanie danych. Procedura ustawiająca pobrana wartość na kg Funkcja pobierająca kg i ustawiająca na nazwę funkcji. Wyświetlenie danych. |
---|
3. Wnioski.
Dziedziczenie i kompozycja s bardzo elastycznymi i wydajnymi technikami powtórnego wykorzystania kodu. W praktyce cz ciej stosuje si ą ęś ę kompozycję, niż dziedzi-
czenie, natomiast w większych programach prawie zawsze obie te techniki są stosowane równocześnie.