Paradygmaty programowania/Ćwiczenia 5: Programowanie obiektowe — przegląd: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 68: | Linia 68: | ||
</div> | </div> | ||
</div> | </div> | ||
==Test== | |||
<quiz type="exclusive"> | |||
Której cechy język obiektowy nie musi posiadać? | |||
<wrongoption reply="Źle">abstrakcyjne typy danych</wrongoption> | |||
<wrongoption reply="Źle">dynamiczne wiązanie wywołań metod z metodami</wrongoption> | |||
<wrongoption reply="Źle">dziedziczenie</wrongoption> | |||
<rightoption reply="Dobrze">podprogramy rodzajowe</rightoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Jakie ograniczenie na przedefiniowywanie metod trzeba narzucić | |||
w języku silnie typowanym? | |||
<wrongoption reply="Źle">przedefiniowana metoda musi być bezparametrowa</wrongoption> | |||
<wrongoption reply="Źle">przedefiniowana metoda musi być typu void</wrongoption> | |||
<rightoption reply="Dobrze">przedefiniowana metoda musi zachować taki sam protokół</rightoption> | |||
<wrongoption reply="Źle">nie trzeba narzucać żadnych ograniczeń</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Rozstrzyganie odwołań do bytów o takiej samej nazwie mających definicje w dwóch klasach bazowych odbywa się w C++ za pomocą: | |||
<rightoption reply="Dobrze">operatora \:\: (dwa dwukropki)</rightoption> | |||
<wrongoption reply="Źle">operatora . (kropka)</wrongoption> | |||
<wrongoption reply="Źle">tego nie da się zrobić</wrongoption> | |||
<wrongoption reply="Źle">dziedziczenie wielokrotne nie jest w C++ dozwolone</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
W języku C++ obiekty zaalokowane na stosie dealokowane są: | |||
<rightoption reply="Dobrze">niejawnie</rightoption> | |||
<wrongoption reply="Źle">za pomocą delete</wrongoption> | |||
<wrongoption reply="Źle">za pomocą free</wrongoption> | |||
<wrongoption reply="Źle">w C++ nie ma takich obiektów</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Językiem, w którym stosowane jest zawsze dynamiczne wiązanie | |||
wywołań z metodami, jest: | |||
<wrongoption reply="Źle">C++</wrongoption> | |||
<wrongoption reply="Źle">C\#</wrongoption> | |||
<wrongoption reply="Źle">Java</wrongoption> | |||
<rightoption reply="Dobrze">Smalltalk</rightoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Językiem, w któym klasa może być samoistna (tzn. nie mieć nadlasy), jest: | |||
<rightoption reply="Dobrze">C++</rightoption> | |||
<wrongoption reply="Źle">C\#</wrongoption> | |||
<wrongoption reply="Źle">Java</wrongoption> | |||
<wrongoption reply="Źle">Smalltalk</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
W języku C++ metody, które mają być wiązane dynamicznie, deklaruje się za pomocą: | |||
<wrongoption reply="Źle">operatora -> (strzałka)</wrongoption> | |||
<wrongoption reply="Źle">słowa abstract</wrongoption> | |||
<wrongoption reply="Źle">słowa dynamic</wrongoption> | |||
<rightoption reply="Dobrze">słowa virtual</rightoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Który nagłówek poprawnie deklaruje w C++ metodę abstrakcyjną? | |||
<wrongoption reply="Źle">virtual void p();</wrongoption> | |||
<rightoption reply="Dobrze">virtual void p() \=0;</rightoption> | |||
<wrongoption reply="Źle">void p() \=0;</wrongoption> | |||
<wrongoption reply="Źle">abstract void p();</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Klasy "lekkie", deklarowane jako struct, alokowane na stosie i nie | |||
pozwalające na dziedziczenie występują w: | |||
<wrongoption reply="Źle">C++</wrongoption> | |||
<rightoption reply="Dobrze">C\#</rightoption> | |||
<wrongoption reply="Źle">Javie</wrongoption> | |||
<wrongoption reply="Źle">we wszystkich wymienionych tu językach</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Który element nie występuje w JavaScripcie? | |||
<rightoption reply="Dobrze">klasy</rightoption> | |||
<wrongoption reply="Źle">obiekty złożone z par (nazwa własności, wartość)</wrongoption> | |||
<wrongoption reply="Źle">operator new</wrongoption> | |||
<wrongoption reply="Źle">zmienne</wrongoption> | |||
</quiz> |
Wersja z 21:39, 12 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 {...};
Test
Której cechy język obiektowy nie musi posiadać?
abstrakcyjne typy danych
dynamiczne wiązanie wywołań metod z metodami
dziedziczenie
podprogramy rodzajowe
Jakie ograniczenie na przedefiniowywanie metod trzeba narzucić w języku silnie typowanym?
przedefiniowana metoda musi być bezparametrowa
przedefiniowana metoda musi być typu void
przedefiniowana metoda musi zachować taki sam protokół
nie trzeba narzucać żadnych ograniczeń
Rozstrzyganie odwołań do bytów o takiej samej nazwie mających definicje w dwóch klasach bazowych odbywa się w C++ za pomocą:
operatora \:\: (dwa dwukropki)
operatora . (kropka)
tego nie da się zrobić
dziedziczenie wielokrotne nie jest w C++ dozwolone
W języku C++ obiekty zaalokowane na stosie dealokowane są:
niejawnie
za pomocą delete
za pomocą free
w C++ nie ma takich obiektów
Językiem, w którym stosowane jest zawsze dynamiczne wiązanie wywołań z metodami, jest:
C++
C\#
Java
Smalltalk
Językiem, w któym klasa może być samoistna (tzn. nie mieć nadlasy), jest:
C++
C\#
Java
Smalltalk
W języku C++ metody, które mają być wiązane dynamicznie, deklaruje się za pomocą:
operatora -> (strzałka)
słowa abstract
słowa dynamic
słowa virtual
Który nagłówek poprawnie deklaruje w C++ metodę abstrakcyjną?
virtual void p();
virtual void p() \=0;
void p() \=0;
abstract void p();
Klasy "lekkie", deklarowane jako struct, alokowane na stosie i nie pozwalające na dziedziczenie występują w:
C++
C\#
Javie
we wszystkich wymienionych tu językach
Który element nie występuje w JavaScripcie?
klasy
obiekty złożone z par (nazwa własności, wartość)
operator new
zmienne