Dzisiaj poruszę temat polimorfizmu, czym jest i do czego jest używany.
Najprościej mówiąc polimorfizm jest to wielopostaciowość, tzn. że pod jedną metodą może się kryć tak naprawdę wiele metod.
Polimorfizm można podzielić na 2 rodzaje:
- Polimorfizm statyczny
- Polimorfizm dynamiczny
Polimorfizm Statyczny
Polimorfizm statyczny można podzielić na 2 rodzaje:
- Przeciążanie metod
Przykład:
public string WyswietlLiczbe(string liczba)
{
return "Liczba to: " + liczba;
}
public string WyswietlLiczbe(int liczba)
{
return "Liczba to: " + liczba.ToString();
}
public string WyswietlLiczbe(double liczba)
{
return "Liczba to: " + liczba.ToString();
}
Jak widać pod jedną metodą mamy tak naprawdę 3 metody, które nazywają się tak samo, ale mają różne parametry wejściowe.
Poniżej przykład złej implementacji kodu bez używania polimorfizmu
Jak widać mamy tutaj 3 osobne metody, które tak naprawdę mają za zadanie zrobić to samo, ale bez polimorfizmu musimy dla każdej z nich wymyślać inną nazwę.
- Przeciążanie operatorów
Przykład:
public class Book
{
private double price;
public Book(double bookPrice)
{
price = bookPrice;
}
public static Book operator+ (Book book1, Book book2)
{
double priceSum = book1.price + book2.price;
Book bookSum = new Book(priceSum);
return bookSum;
}
}
Book book1 = new Book(10);
Book book2 = new Book(20);
Book sum = book1 + book2;
Polimorfizm Dynamiczny
Polimorfizm dynamiczny jest związany z metodami wirtualnymi i abstrakcyjnymi i jest to po prostu przysłanianie funkcji.
- Metody wirtualne przykład:
public class Book
{
public virtual string GetPrice()
{
return "30 złoty";
}
}
public class HarryPotterSeriesBook : Book
{
public override string GetPrice()
{
return "50 złoty";
}
}
public class TheLordOfTheRingsSerisesBook : Book
{
public override string GetPrice()
{
return "40 złoty";
}
}
- Klasy abstrakcyjne przykład:
public abstract class FantasyBook
{
public abstract int GetPageCount();
public abstract string GetPrice();
}
public class HarryPotterSeriesBook : FantasyBook
{
public override int GetPageCount()
{
return 300;
}
public override string GetPrice()
{
return "30 złoty";
}
}
public class TheLordOfTheRingsSerisesBook : FantasyBook
{
public override int GetPageCount()
{
return 240;
}
public override string GetPrice()
{
return "50 złoty";
}
}
Jak widać polimorfizm ułatwia pisanie kodu, ponieważ nie trzeba tworzyć osobnych nazw metod, które de facto robiłyby to samo.