Paradygmaty programowania/Ćwiczenia 5: Programowanie obiektowe — przegląd: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 7 wersji utworzonych przez 5 użytkowników) | |||
Linia 1: | Linia 1: | ||
===Zadanie 1=== | ===Zadanie 1=== | ||
Co wypisuje poniższy program w języku C++? Odpowiedz, a potem skompiluj program i sprawdź... Uwaga | Co wypisuje poniższy program w języku C++? Odpowiedz, a potem skompiluj program i sprawdź... Uwaga: do poprawnego skompilowania programu potrzebne będzie dołączenie pliku nagłówkowego (#include <iostream>) i deklaracja przestrzeni nazw (using namespace std;). | ||
class A | |||
{ | { | ||
public: | public: | ||
Linia 9: | Linia 9: | ||
virtual void h() { cout << ”A.h”; } | virtual void h() { cout << ”A.h”; } | ||
}; | }; | ||
class B: public A | class B: public A | ||
{ | { | ||
Linia 17: | Linia 17: | ||
virtual void h() { cout << ”B.h”; } | virtual void h() { cout << ”B.h”; } | ||
}; | }; | ||
void main() | void main() | ||
{ | |||
A x = B(); | |||
A* y = new B(); | |||
x.f(); | |||
y–>f(); | |||
} | } | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Pamiętaj, że dynamiczne wiązanie wywołań z metodami następuje tylko wtedy, gdy metoda jest zadeklarowana jako virtual, a instancja obiektu użyta do wywołania jest zaalokowana na stercie. | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Pamiętaj, że dynamiczne wiązanie wywołań z metodami następuje tylko wtedy, gdy metoda jest zadeklarowana jako virtual, a instancja obiektu użyta do wywołania jest zaalokowana na stercie. | ||
</div> | </div> | ||
</div> | </div> | ||
===Zadanie 2=== | ===Zadanie 2=== | ||
Jak zmieni się wynik programu z zadania 1, jeśli usuniemy deklarację virtual przy funkcji f w klasie A? Które deklaracje virtual można usunąć bez żadnej zmiany zachowania programu? | Jak zmieni się wynik programu z zadania 1, jeśli usuniemy deklarację virtual przy funkcji f w klasie A? Które deklaracje virtual można usunąć bez żadnej zmiany zachowania programu? | ||
Linia 47: | Linia 48: | ||
Przyjrzyj się dwom poniższym klasom. Czy taki układ to dobry pomysł? | Przyjrzyj się dwom poniższym klasom. Czy taki układ to dobry pomysł? | ||
class Silnik {...}; | |||
class Samochód : Silnik {...}; | class Samochód : Silnik {...}; | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Dziedziczenie powinno pojawiać się tam, gdzie chcemy zdefiniować coś bardziej wyspecjalizowanego. Klasyczne dziedziczenie odpowiada przecież relacji bycia podtypem, czyli relacji „obiekt z podklasy jest obiektem z klasy bazowej”. W przykładzie z silnikiem i samochodem ta relacja nie zachodzi: obiekt z klasy Samochód ewidentnie nie jest szczególnym przypadkiem obiektu z klasy Silnik. Powiedzielibyśmy natomiast, że (obiekt z klasy) Samochód ma (obiekt z klasy) Silnik, a w takim razie napisalibyśmy zapewne tak: | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Dziedziczenie powinno pojawiać się tam, gdzie chcemy zdefiniować coś bardziej wyspecjalizowanego. Klasyczne dziedziczenie odpowiada przecież relacji bycia podtypem, czyli relacji „obiekt z podklasy '''jest''' obiektem z klasy bazowej”. W przykładzie z silnikiem i samochodem ta relacja nie zachodzi: obiekt z klasy Samochód ewidentnie nie jest szczególnym przypadkiem obiektu z klasy Silnik. Powiedzielibyśmy natomiast, że (obiekt z klasy) Samochód '''ma''' (obiekt z klasy) Silnik, a w takim razie napisalibyśmy zapewne tak: | ||
class Samochód { | |||
Silnik s; | Silnik s; | ||
... | ... | ||
}; | }; | ||
</div> | </div> | ||
</div> | </div> | ||
===Zadanie 6=== | ===Zadanie 6=== | ||
Popatrz teraz na takie dwie klasy i porównaj ten przykład z sytuacją z poprzedniego zadania. | Popatrz teraz na takie dwie klasy i porównaj ten przykład z sytuacją z poprzedniego zadania. | ||
class Samochód {...}; | |||
class Ciężarówka : Samochód {...}; | class Ciężarówka : Samochód {...}; | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Te dwie sytuacje stanowią przejrzystą ilustrację różnicy między dziedziczeniem a enkapsulacją... | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Te dwie sytuacje stanowią przejrzystą ilustrację różnicy między dziedziczeniem a enkapsulacją... | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 20:30, 22 wrz 2006
Zadanie 1
Co wypisuje poniższy program w języku C++? Odpowiedz, a potem skompiluj program i sprawdź... Uwaga: do poprawnego skompilowania programu potrzebne będzie dołączenie pliku nagłówkowego (#include <iostream>) i deklaracja przestrzeni nazw (using namespace std;).
class A { public: virtual void f() { cout << ”A.f”; g(); } void g() { cout << ”A.g”; h(); } virtual void h() { cout << ”A.h”; } }; class B: public A { public: virtual void f() { cout << ”B.f”; g(); } void g() { cout << ”B.g”; h(); } virtual void h() { cout << ”B.h”; } }; void main() { A x = B(); A* y = new B(); x.f(); y–>f(); }
Zadanie 2
Jak zmieni się wynik programu z zadania 1, jeśli usuniemy deklarację virtual przy funkcji f w klasie A? Które deklaracje virtual można usunąć bez żadnej zmiany zachowania programu?
Zadanie 3
Wykorzystanie dynamicznego wiązania wywołań z metodami oznacza, że często będziemy odwoływali się do obiektów z klas pochodnych za pomocą zmiennej (wskaźnika) z klasy bazowej. Jakie są tego konsekwencje dla dealokacji pamięci w językach, w których jest ona jawna? Czy z alokacją jest podobnie?
Zadanie 4
Napisz program w Javie, dzięki któremu będzie można zobaczyć, czy i kiedy następuje wywołanie metody finalize. Powinien on dać się uruchomić w różnych wariantach, w których będzie potrzebował mniej lub więcej pamięci.
Zadanie 5
Przyjrzyj się dwom poniższym klasom. Czy taki układ to dobry pomysł?
class Silnik {...}; class Samochód : Silnik {...};
Zadanie 6
Popatrz teraz na takie dwie klasy i porównaj ten przykład z sytuacją z poprzedniego zadania.
class Samochód {...}; class Ciężarówka : Samochód {...};