Metody wirtualne

widget

Metody wirtualne pozwalają na przesłanianie (zastępowanie) metod w podklasach.
#Do definiowania metody wirtualnej służy słowo kluczowe: virtual
#Aby zasłonić metodę z klasy bazowej w klasie nadrzędnej należy zdefiniować funkcje ze słowem kluczowym override z dokładnie tą samą nazwą i parametrami.
#Aby odwołać się do przesłoniętej metody należy użyć słowa kluczowego base.
#Nie jest wymogiem przesłanianie metody wirtualnych w klasach nadrzędnych.

class Pracownik
{
    public float pensja;

    public virtual void WyplacPensje(float kwota)
    {
        pensja += kwota;
    }
}

class Programista : Pracownik
{
    public override void WyplacPensje(float kwota)
    {
        base.WyplacPensje(kwota); //odwołanie się do przysłoniętej funkcji
        pensja += 200; // 200 zł premii
    }
}

class Administrator : Pracownik
{
    public override void WyplacPensje(float kwota)
    {
        pensja += 150; // 150 zł premii
    }
}

class Program
{
    static void Main(string[] args)
    {
        Pracownik pracownik = new Pracownik();
        Programista programista = new Programista();
        Administrator admin = new Administrator();

        pracownik.WyplacPensje(100);
        Console.WriteLine("Teraz pracownik tyle dostal: "
                          + pracownik.pensja); // 100

        programista.WyplacPensje(300);
        pracownik = programista;
        Console.WriteLine("Teraz pracownik (programista) tyle dostal: "
                          + pracownik.pensja); // 300 + 200 = 500

        admin.WyplacPensje(300);
        pracownik = admin;
        Console.WriteLine("Teraz pracownik (admin) tyle dostal: "
                          + pracownik.pensja); // 150 - tylko premia
    }

Wynik będzie następujący:

Teraz pracownik tyle dostal: 100
Teraz pracownik (programista) tyle dostal: 500
Teraz pracownik (admin) tyle dostal: 150

5 komentarzy

Wkradł się błąd "Aby zasłonić metodę z klasy bazowej w klasie nadrzędnej"
Kasa bazowa jest klasą nadrzędną, powinno być "w klasie pochodnej".

Tak sobie myślę, może by przenieść ten tekst do kategorii głównej "C sharp"? Tekst dotyczy opisu języka C#, więc powinien się tam IMO znaleźć, a z drugiej strony są w "C sharp/Podręcznik" linki do Funkcji wirtualnych itd...

pomyliłem się, ten artykuł jest o przestrzeniach nazw, a wrzuciłem go do funkcji wirtualnych :/

Eee.. po co usunąłeś zawartość tego tekstu? :/

Wnioskuje o zmiane tytulu na "metody wirtualne".