Programowanie obiektowe, opracowanie: dr inż. Grzegorz Filo
IIS, M-72
Politechnika Krakowska im. Tadeusza Kościuszki
Wydział Mechaniczny
Instytut Informatyki Stosowanej M-7
Zakład Grafiki i Modelowania Komputerowego M-72
Laboratorium: Klasy abstrakcyjne i polimorfizm
Programowanie obiektowe Nr. proj.: 06b, 2 x 45 minut
dr inż. Grzegorz Filo
1. Cel laboratorium
Celem ćwiczenia jest zbudowanie aplikacji obliczeniowej przy wykorzystaniu technik
definiowania klas abstrakcyjnych i mechanizmów polimorfizmu. Aplikację należy
zaimplementować w środowisku Turbo C++ 2006.
2. Wymagane oprogramowanie
Zadanie należy wykonać przy wykorzystaniu środowiska programowania
Borland Turbo C++ 2006.
3. Zadanie do wykonania
Temat: Należy zmodyfikować aplikację wykonaną w ramach projektu 6a:
3.1) Zastosować następujący sposób dziedziczenia:
TBryla
TKula
TStozek
TWalec TRura
Abstrakcyjna klasa
TBryla
powinna zawierać:
• składnik
Objetosc
typu
double
w sekcji
protected
;
• czysto wirtualną metodę
double Oblicz()
w sekcji
protected
;
• metodę wirtualną
void PokazDane(TStringGrid*)
w sekcji
public
;
• metodę
void Wypisz(TLabel*)
w sekcji
public
formatującą i wypisującą
w kontrolce
TLabel
wartość objętości bryły.
Ciało metody PokazDane() w klasie
TBryla
:
void TBryla::PokazDane(TStringGrid* G){
G‐>RowCount = 2;
G‐>Cells[0][0]="Nazwa";
G‐>Cells[1][0]="Wartość";
};
3.2) W klasach potomnych należy:
• przedefiniować metody wirtualne z klasy abstrakcyjnej wypisując kolejne parametry
definiowane w klasach pochodnych, np. w klasie TKula:
void TKula::PokazDane(TStringGrid* G){
TBryla::PokazDane(G);
G‐>Cells[0][1]="R";
G‐>Cells[1][1]=FloatToStrF(R,ffFixed,6,2);
};
• zdefiniować funkcje przypisujące wartości zdefiniowanym w każdej klasie
parametrom. Należy zastosować konwencję nazw set-get, np. w klasie
TKula
należy
zdefiniować publiczną funkcję
void setR(double)
;
• z klas potomnych należy usunąć metodę
void Wypisz()
.
Programowanie obiektowe, opracowanie: dr inż. Grzegorz Filo
IIS, M-72
3.3) Logika działania aplikacji jak w laboratorium 6a, należy uwzględnić następujące
wskazówki:
•
w klasie formatki (domyślnie
TForm1
) w sekcji
public
zdefiniować wskaźniki do
obiektów poszczególnych klas, np.:
TBryla* B;
TKula* Kula; // itd.
• w konstruktorze formatki utworzyć obiekty pokazywane przez wskaźniki (oprócz
TBryla
) i wywołać programowo kliknięcie na komponent
TRadioGroup
, natomiast w
metodzie FormDestroy zniszczyć.
•
w procedurze obsługi kliknięcia na
TRadioGroup
przypisać wskaźnik
TBryla
:
switch(RadioGroup1‐>ItemIndex){
case 0: B = Kula; break;
case 1: B = Stozek; break;
case 2: B = Walec; break;
case 3: B = Rura; break;
}
B‐>PokazDane(StringGrid1);
B‐>Wypisz(Label1);
• w procedurze obsługi kliknięcia na przycisk przypisać dane stosując rzutowanie RTTI
oraz mechanizm obsługi wyjątków:
{
double x;
Label1‐>Caption = "Pole = ???";
try{
if(dynamic_cast<TKula*>(B)){
x = StrToFloat(StringGrid1‐>Cells[1][1]);
if (x<0) throw ERangeError("Ujemna wartość R !");;
(dynamic_cast<TKula*>(B))‐>setR(x);
};
// itd
B‐>Wypisz(Label1);
}catch(EConvertError & e){
ShowMessage( "Niepoprawna wartość parametru");
}catch(ERangeError & e){
ShowMessage(e.Message);
}
}
4. Bibliografia
[1] Matulewski
J.,
C++Builder i Turbo C++. Podstawy, Wydawnictwo Helion,
Gliwice 2006;
[2] Daniluk
A.,
C++ Builder Borland Deweloper Studio 2006. Kompendium programisty,
Wydawnictwo Helion, Gliwice 2006;
[3] Matulewski
J.
C++Builder 2006. 222 gotowe rozwiązania, Wydawnictwo Helion,
Gliwice 2006;