W dzisiejszym poście poruszamy temat polimorfizmu w języku C#.

POLIMORFIZM W JĘZYKU C#

 

Słowo polimorfizm ma wiele znaczeń. W programowaniu obiektowym jest to jeden z paradygmantów, który najczęściej jest wyrażany jako „jeden interfejs, wiele funkcji”.

Polimorfizm może być statyczy i dynamiczny. W polimorfizmie statycznym odpowiedź funkcji jest określna w trakcie kompilowania. W polimorfizmie dynamicznym odpowiedź ta jest podejmowana w czasie wykonywania programu.

Polimorfizm statyczny

Mechanim łączenia metody z obiektem w trakcie kompilacji jest nazywany wczesnym wiązaniem lub też statycznym wiązaniem. C# udostępnia dwa sposoby implementowania statycznego polimorfizmu:

  • przeciążanie metod;
  • przeciązanie operatorów.

 

Przeciążanie metod

W tej samej definicji klasy może znajdować się wiele funkcji o tej samej nazwie. Definicja metod musi się różnić od siebie typem i/lub liczbą parametrów. Nie można przeciążyć metod, które różnią się tylko zwracanym typem.

 

Poniższy przykłąd demonstruje nam w jaki spoóśb można dokonać przeciążenia metody:

 

Przeciążanie operatorów

C# pozwala na zmianę lub przeciążenie większości wbudowanych operatorów. Jako programista możesz użyć operatorów z typami zdefiniowanymi również przez użytkownika.

Przeciążone operatory to metody z nazwą, innymi słowami kluczowy operator, po którym występuje symbol operatora, który chcemy zdefiniować. Przeciążony operator ma typ zwracany oraz listę parametrów.

Przejdziemy od razu do obszernego przykładu gdyż tak łatwiej będzie zrozumieć jak w praktyce wygląda przeciązanie operatorów.

Operatory przeciążalne i nieprzeciążalne

 

Poniżej lista opisująca możliwości przeciążania operatorów:

OperatorOpis
+, -, !, ~, ++, --operatory jednoargumentowe mogą zostać przeciążone
+, -, *, /, %operatory binarne mogą zostać przeciążone
==, !=, <,>, <=, >=operatory porównania mogą zostać przeciążone
&&, ||operatory operacji logicznych nie mogą być przeciążone bezpośrednio
+=, -=, *=, /=, %=operatory przypisania nie mogą być przeciążone
=, ., ?:, ->, new, is, sizeof, typeofte operatory nie mogą być przeciążone

 

Przykład przeciążania różnych operatorów:

Polimorfizm dynamiczny

C# pozwala tworzyć klasy abstrakcyjne, które następnie są implementowane w klasach pochodnych. Klasa taka zawiera abstrakcyjne metody, których implementacja zależy od wykorzystania w poszczególnych klasach pochodnych.

Poniżej lista zasad o których należy pamiętać tworząć klasy abstrakcyjne:

  • nie można utworzyć instancji klasy abstrakcyjnej;
  • nie można zadeklarować metody abstrakcyjnej poza klasą abstrakcyjną;
  • kiedy klasa opatrzona jest modyfikatorem dostępu sealed nie może być dziedziczona. Dodatkowo, klasa abstrakcyjna nie może być zdefinowana jakas sealed.

Przykład:

Jeżeli definiujesz metodę w klasie bazowej, ale chcesz jej użyć w innej klasie, czyli w klasie pochodnej możesz do tego celu zastosować metody virtualne. Metody te mogą mieć różne implementacje w klasie pochodnej, ale nie jest to reguła, ponieważ nie muszą.
Co to znaczy? A no znaczy to to że, jeśli w klasie pochodnej nie użyjesz implementacji metody wirtualnej z klasy bazowej, to użyta zostanie domyślna implementacja z klasy bazowej.

Wybór odnośnie wywołania metody podejmowany jest w czasie wykonywania programu.

Polimorfizm dynamiczny jest realizowany za pomocą klas abstrakcyjnych oraz metod wirtualnych.

Przykład:

Mam nadzieje że wytłumaczyłem w sposób zrozumiały na czym polega polimorfizm.

 

Pytania? Sugestie? piszcie, komentujcie i lajkujcie.

 

Oczywiście cały Przykłady dostępne na GitHubie.

Post Author: Csharpowe Zmagania

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.