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.