Programowanie Obiektowe – Wykład 6

1 Programowanie Obiektowe – Wykład 6dr Piotr Jastrzębski ...
Author: Artur Bednarski
0 downloads 13 Views

1 Programowanie Obiektowe – Wykład 6dr Piotr Jastrzębski Wydział Matematyki i Informatyki

2 Tematyka wykładu Polimorfizm Wyjątki – obsługa błędów (wstęp)

3 Filary/założenia programowania obiektowegoAbstrakcja Hermetyzacja Dziedziczenie Polimorfizm

4 Polimorfizm poli – wiele morf – postać wielopostaciowośćPolimorfizm - zdolność obiektu do różnych zachowań Cel: uproszczenie i skrócenie kodu programu

5 Polimorfizm w C# statyczny przeciążenie funkcjiprzeciążenie operatorów dynamiczny funkcje wirtualne funkcje abstrakcyjne

6 Polimorfizm statycznyw tej samej klasie może istnieć wiele metod o tej samej nazwie metody różnią się parametrami, wykonanie metod zależy od parametrów zachodzi w trakcie kompilacji programu nie mamy wpływu na zachowanie metod w trakcie działania programu

7 Przykład static string OpiszTyp() { return "Metoda bez argumentów"; } static string OpiszTyp(int x) return "Liczba całkowita"; static string OpiszTyp(string x) return "Łańcuch znaków"; static string OpiszTyp(double x, int y) return "Liczba double i liczba całkowita";

8 Polimorfizm dynamicznypolega na różnym zachowaniu metod o tej samej sygnaturze w klasach będących w relacji dziedziczenia. metody o tej samej sygnaturze – metody o tej samej nazwie, typie zwracanym i parametrach w zależności od typu referencji wykonywana jest odpowiednia implementacja (instrukcje w metodzie) metody polimorficzne metody wirtualne metody abstrakcyjne

9 Przykład – przesłanianie zwykłej metodyclass Pojazd { public void Jedz() { Console.WriteLine("Jadę pojazdem"); } } class Samochod: Pojazd public void Jedz() { Console.WriteLine("Jadę samochodem"); }

10 Pojazd p1 = new Pojazd(); p1. Jedz(); Samochod s1 = new Samochod(); s1Pojazd p1 = new Pojazd(); p1.Jedz(); Samochod s1 = new Samochod(); s1.Jedz(); Pojazd sp1 = new Samochod(); sp1.Jedz();

11 Rozwiązanie – nadpisanie (ukrycie) metody - newclass Pojazd { public void Jedz() { Console.WriteLine("Jadę pojazdem"); } } class Samochod: Pojazd public new void Jedz() { Console.WriteLine("Jadę samochodem"); }

12 Wady nadpisywania brak elastyczności koduprzy dużej hierarchii dziedziczenia i rzutowaniach wykonywana jest metoda z klasy bazowej Nadpisywanie nie jest polimorfizmem.

13 Metoda wirtualna oznaczona słowem kluczowym virtualwłącza mechanizm polimorfizmu dynamicznego tworzymy ją w klasie bazowej w klasach pochodnych przesłaniamy metody wirtualne za pomocą słowa kluczowego override przesłonięcie nie jest obowiązkowe, w razie jego braku zostanie wywołana metoda klasy bazowej metody statyczne ani prywatne nie mogą być wirtualne metody, które nie są wirtualne, nie można przesłonić za pomocą override

14 class Pojazd { public virtual void Jedz() { Consoleclass Pojazd { public virtual void Jedz() { Console.WriteLine("Jadę pojazdem"); } } class Samochod: Pojazd public override void Jedz() { Console.WriteLine("Jadę samochodem"); }

15 Pojazd p1 = new Pojazd(); p1. Jedz(); Samochod s1 = new Samochod(); s1Pojazd p1 = new Pojazd(); p1.Jedz(); Samochod s1 = new Samochod(); s1.Jedz(); Pojazd sp1 = new Samochod(); sp1.Jedz();

16 Po co? dajemy informację dla innej osoby zajmującej się kodemprzy tworzeniu klasy potomnych mamy elastyczność: możemy zostawić to jak jest w klasie bazowej lub przesłonić

17 Metody wirtualne w klasie Objectw C# każda klasa dziedziczy niejawnie z klasy Object public class Object { /* składowe wirtualne */ virtual public bool Equals(object o); virtual protected void Finalize(); virtual public string ToString(); /* itp.. */ }

18 Metody abstrakcyjne poprzedzone słowem kluczowym abstractzdefiniowane w klasie bazowej nie zawierają ciała metody (podobnie jak przy interfejsach) mogą być zadeklarowane tylko w klasie abstrakcyjnej (poprzedzonej słowem abstract) nie możemy stworzyć egzemplarza (obiektu) klasy abstrakcyjnej (podobnie jak przy interfejsach), ale możemy dziedziczyć po klasie abstrakcyjnej klasa abstrakcyjna może posiadać zwykłe metody (z implementacją) klasa pochodna do klasy abstrakcyjnej musi przesłonić wszystkie metody abstrakcyjne

19 abstract class Pojazd { public abstract void Jedz(); } class Samochod: Pojazd public override void Jedz() { Console.WriteLine("Jadę samochodem"); } class Rower : Pojazd public override void Jedz() { Console.WriteLine("Jadę rowerem"); }

20 Nie możemy stworzyć obiektu klasy abstrakcyjnejPojazd p1 = new Pojazd();

21 List pojazdy = new List(); pojazdyList pojazdy = new List(); pojazdy.Add(new Rower()); pojazdy.Add(new Samochod()); foreach(var element in pojazdy) { element.Jedz(); }

22 Wirtualne czy abstrakcyjne?tam gdzie może dojść do powielenia kodu w klasie potomnej chcemy stworzyć obiekty klasy bazowej np. ToString() abstrakcyjne w sytuacjach gdy nie powielamy kodu tworzenie obiektów klasy bazowej nie ma sensu

23 Przykład abstract public class Figura { protected int a, b; abstract public int Pole(); } public class Kwadrat : Figura public ovverride int Pole() { return a * a; } public class Trojkat : Figura public override int Pole() { return 1 / 2 * a * b; }

24 Łamigłówka wirtualne-abstrakcyjne-i-polimorfizm/

25 Wyjątki i obsługa błędówWyjątek - mechanizm kontroli przepływu występujący w językach programowania i służący do obsługi zdarzeń wyjątkowych

26 Blok try catch try { // kod } catch // kod w razie wystąpienia wyjątku

27 try { //kod } catch (Exception e) Console.WriteLine(e.Message);

28 Właściwości klasy System.ExceptionData Dodatkowe informacje na temat źródła wystąpienia wyjątku. HelpLink Umożliwia odczytanie lub ustawienie linka (np. do pomocy) związanego z błędem. Message Komunikat błędu. Source Umożliwia odczytanie lub przypisanie nazwy aplikacji lub obiektu, w którym wystąpił błąd. TargetSite Umożliwia odczytanie metody, w której wystąpił błąd.

29 Celowe wywołanie wyjątkutry { throw new IndexOutOfRangeException(); } catch (Exception e) Console.WriteLine(e.Message);

30 Własna klasa na wyjątki – dziedziczy po System.Exceptionpublic class NaszWyjątekException : System.Exception { public NaszWyjątekException (string Message) : base(Message) this.Source = „Nasz własny wyjątek"; this.HelpLink = "http://google.pl/"; }