Polimorfizm dynamiczny
Polimorfizm dynamiczny, inaczej zwany "runtime polymorphism" lub "overriding", polega na tym, że metoda o tej samej nazwie i sygnaturze (liczba i typ argumentów) może zachowywać się inaczej w zależności od typu obiektu, na którym jest wywoływana.
Jeżeli masz zdefiniowaną metodę w klasie bazowej, ale chcesz, żeby została zaimplementowana w
klasach pochodnych możesz do tego celu zastosować metody wirtualne
.
using System;
class Program
{
static void Main()
{
Zwierzeta[] listaZwierzat = { new Pies(), new Kot() }; // Tworzenie tablicy obiektów typu Zwierzeta zawierającej instancje klasy Pies i Kot
foreach (Zwierzeta ssaki in listaZwierzat) // Iteracja po wszystkich elementach tablicy
{
ssaki.DajGlos(); // Wywołanie metody DajGlos() dla każdego obiektu
}
}
class Zwierzeta
{
public virtual void DajGlos() // Metoda wirtualna, która może być przesłonięta w klasach pochodnych
{
Console.WriteLine("zwierzę wydaje dźwięk"); // Wyświetlenie informacji o dźwięku wydawanym przez zwierzę
}
}
class Pies : Zwierzeta
{
public override void DajGlos() // Przesłonięcie metody DajGlos() z klasy bazowej
{
Console.WriteLine("Hau hau!"); // Wyświetlenie dźwięku szczekania psa
}
}
class Kot : Zwierzeta
{
public override void DajGlos() // Przesłonięcie metody DajGlos() z klasy bazowej
{
Console.WriteLine("Miauu!"); // Wyświetlenie dźwięku miauczenia kota
}
}
}
W tym przykładzie, klasa Zwierzęta posiada metodę DajGlos() oznaczoną jako wirtualną, co pozwala na jej przesłanianie w klasie dziedzicznej Kot. W metodzie Main program tworzy tablicę z obiektem klasy dziedzicznej Zwierzęta i wywołuje na nich DajGlos(). W wyniku tego każdy obiekt wykona swoją własną implementację metody DajGlos() i wyświetli odpowiedni dźwięk.