Przeciążanie
Przegląd zagadnień
Tematem tego modułu jest przeciążanie metod. Wprowadzone zostaną związane z tym tematem pojęcia metod wirtualnych i abstrakcyjnych, a także zamknięcia metody przed przeciążaniem.
Wprowadzenie teoretyczne zostanie uzupełnione przykładami kodu w języku C# oraz schematami klas w notacji UML.
W dalszej części zdobyta wiedza zostanie podsumowana oraz sprawdzona pytaniami kontrolnymi, po czym studenci samodzielnie wykonają ćwiczenia laboratoryjne.
Metody wirtualne
Na poprzednich zajęciach wprowadzone zostało pojęcie dziedziczenia klas oraz wiążąca się z dziedziczeniem możliwość przesłaniania metod klasy bazowej w klasie pochodnej za pomocą słowa new.
Pisząc klasę, która będzie służyła jako klasa bazowa, możemy wskazać metody, których funkcjonalność może być zmieniana w klasach pochodnych. Robimy to dodając w definicji klasy słowo virtual.
W przykładzie tworzymy klasę Prostokat, której składowymi są długości boków oraz metoda obliczająca pole. Zamierzamy stworzyć klasę Kwadrat dziedziczącą po klasie Prostokat i zmodyfikować metodę Pole(), dlatego oznaczamy ją jako wirtualną.
Przeciążanie metod
W klasie Kwadrat dziedziczącej po klasie Prostokąt definiujemy ponownie metodę Pole(). Ponowna definicja metody w klasie pochodnej to przeciążanie metody. Oznaczamy je przy pomocy słowa kluczowego override.
Klasy abstrakcyjne
Zanim przejdziemy do pojęcia metody abstrakcyjnej, musimy zapoznać się z pojęciem klasy abstrakcyjnej.
Klasa abstrakcyjna nie może być instancjonowana, może służyć tylko jako klasa bazowa dla klas pochodnych. Klasa abstrakcyjna zawiera metody i zmienne składowe, jakie będą wchodziły w skład klas pochodnych.
Na przykładzie przedstawionym na slajdzie tworzymy klasę abstrakcyjną Figura. Nie możemy utworzyć obiektu tej klasy - w tym przypadku niewiele wiemy na przykład o kształcie figury. Próba instancjonowania klasy abstrakcyjnej kończy się błędem.
Możemy jednak określić wspólne elementy figur: współrzędne środka figury. Możemy też zdefiniować metodę, która będzie funkcjonowała dla wszystkich obiektów klas pochodnych klasy Figura - będzie to Odleglosc(), metoda obliczająca odległość środka figury od początku układu współrzędnych.
Po prawej stronie przedstawiony jest schemat klasy w notacji UML - nazwa klasy abstrakcyjnej jest podana kursywą.
Metody abstrakcyjne (1)
Klasa abstrakcyjna może zawierać metody abstrakcyjne (nie mogą one występować w klasach, które nie są abstrakcyjne). Metoda oznaczona słowem abstract musi zostać przeciążona w klasie pochodnej.
Na slajdzie w abstrakcyjnej klasie Figura pojawiła się abstrakcyjna metoda Pole(). Każda klasa dziedzicząca po klasie Figura musi przeciążać metodę Pole().
Na schemacie klasy abstrakcyjna metoda jest wyróżniona kursywą.
Metody abstrakcyjne (2)
Ponownie tworzymy klasę Prostokat, tym razem dziedzicząc po abstrakcyjnej klasie bazowej Figura. Musimy przeciążyć metodę Pole() - odbywa się to za pomocą słowa kluczowego override.
Przeciążona metoda może być ponownie przeciążona w klasie pochodnej. Utworzona wcześniej klasa Kwadrat może pozostać bez zmian, nie ma potrzeby oznaczania metody Pole() jako metody wirtualnej stosując słowo virtual.
Metody zamknięte
Jeśli chcemy, aby metoda nie była więcej przeciążana w klasach pochodnych, zamykamy ją słowem kluczowym sealed.
Podsumowanie
Na zajęciach przedstawiony został mechanizm przeciążania metod. W tym celu wprowadzone zostało pojęcie metody wirtualnej oraz szereg modyfikatorów funkcji: virtual, override, abstract, sealed.
Omówiono abstrakcyjne klasy oraz abstrakcyjne metody, przedstawione zostały przykłady kodu w języku C#.
Pytania sprawdzające
Pytania dla studentów:
Czym są metody wirtualne i na czym polega ich przeciążanie?
Czym jest klasa abstrakcyjna?
Czym jest metoda abstrakcyjna?
Laboratorium
Zadania do wykonania przez studentów:
Korzystając z mechanizmu przeciążania oraz klas abstrakcyjnych, napisz klasy na potrzeby programu wykonującego obliczenia z geometrii analitycznej. Przedstaw różne rodzaje wielokątów, koło, elipsę.
Do klas figur dodaj metody obliczające pola powierzchni, obwody i odległości między charakterystycznymi punktami.
L
L