Programowanie obiektowe w kwalifikacji INF.04: najważniejsze zasady, przykłady i 106 powiązanych pytań w banku.
Programowanie obiektowe porządkuje program wokół obiektów, które mają własny stan i zachowanie. Na egzaminie trzeba nie tylko znać definicje, lecz także przewidzieć wynik działania krótkiego fragmentu kodu i rozpoznać relację między klasami.
Od klasy do obiektu
Klasa jest opisem wspólnych pól i metod, a obiekt konkretnym egzemplarzem utworzonym na jej podstawie. Jeśli klasa Konto ma pole saldo i metodę wplac, dwa obiekty tej klasy mogą mieć różne salda, ale wykonują tę samą logikę metody. Konstruktor ustawia poprawny stan początkowy, na przykład numer rachunku i saldo równe zero.
Metoda instancyjna działa na stanie konkretnego obiektu. Metoda statyczna należy do klasy i nie potrzebuje egzemplarza, więc nadaje się na przykład do funkcji tworzącej identyfikator. W pytaniu z kodem najpierw zaznacz, ile obiektów powstało i które przypisanie zmienia pole obiektu, a które tylko zmienną lokalną.
Cztery filary w praktyce
Pojęcie
Co oznacza
Przykład
hermetyzacja
stan zmienia się tylko przez metody
prywatne saldo, publiczne wyplac z kontrolą kwoty
abstrakcja
wspólna umowa bez szczegółów
klasa abstrakcyjna Figura z metodą pole
dziedziczenie
relacja „jest"
PracownikEtatowy jest Pracownikiem
polimorfizm
wywołanie zależy od rzeczywistego obiektu
figura.pole() liczy pole koła, gdy obiekt to Kolo
Modyfikatory public, private i protected określają, skąd wolno korzystać z elementu klasy, ale same nie zastępują dobrze zaprojektowanych metod. Interfejs określa wymagany zestaw operacji: różne klasy, na przykład Drukarka i EksporterPdf, mogą realizować tę samą umowę zapisz bez wspólnego przodka. Klasy abstrakcyjnej nie tworzy się bezpośrednio.
Przeciążanie i przesłanianie to dwie różne rzeczy
Przeciążanie oznacza kilka metod o tej samej nazwie, ale różnych listach parametrów:
void drukuj(string tekst) { }
void drukuj(string tekst, int kopie) { }
// kompilator wybiera wersje po ARGUMENTACH wywolania
int drukuj(string tekst) { }
// BLAD: sama zmiana typu zwracanego nie tworzy przeciazenia,
// bo typ wyniku nie jest czescia sygnatury
Przesłanianie dotyczy dziedziczenia: Figura deklaruje wirtualną metodę pole, a Kolo dostarcza własną implementację. Gdy zmienna typu Figura wskazuje obiekt Kolo, wywołana zostanie wersja właściwa dla rzeczywistego obiektu: to polimorfizm czasu wykonania. Nie myl go z ukryciem metody, przy którym wybór może zależeć od typu zmiennej.
Kompozycja zamiast sztucznego dziedziczenia
Kompozycja opisuje relację „ma": Samochod ma Silnik, więc przechowuje obiekt i przekazuje mu zadanie uruchomienia. Zdanie „Samochod jest Silnikiem" byłoby fałszywe, dlatego dziedziczenie tu nie pasuje. Podobnie Koszyk może korzystać z obiektu KalkulatorRabatu, zamiast dziedziczyć po nim dla jednej metody.
Kompozycja ułatwia wymianę części programu i testowanie ich osobno (jak, pokazuje artykuł o testowaniu). Dziedziczenie jest właściwe, gdy klasa potomna rzeczywiście może zastąpić bazową bez łamania jej umowy. Na egzaminie zadaj dwa pytania: czy zachodzi relacja „jest", czy jedynie „ma" albo „używa". Jak czytać kod obiektowy na egzaminie
1.
Rozpisz klasy od bazowej do potomnych, zaznacz konstruktory, pola statyczne i metody przesłonięte.
2.
Przejdź instrukcje po kolei, zapisując osobno stan każdego obiektu.
3.
Przy wywołaniu metody sprawdź typ rzeczywistego obiektu, a przy przeciążonej liczbę i typy argumentów.
4.
Zwróć uwagę na kolejność konstruktorów, zakres zmiennych i przekazywanie obiektów do metod.
Jeżeli dwie zmienne wskazują ten sam obiekt, zmiana jego pola będzie widoczna przez obie. Utworzenie nowego obiektu i przypisanie go do jednej zmiennej nie zmienia obiektu wskazywanego przez drugą. Fragmenty kodu do prześledzenia znajdziesz w arkuszach INF.04.