C# METODY WIRTUALNE


Ta lekcja którą przerabiasz jest na temat metod wirtualnych. Co to są metody wirtualne? Metody wirtualne to takie metody które zostały zadeklarowane w klasie bazowej jako virtual a w klasie wyprowadzonej przykryte (override). Czasem będziesz chciał aby poprzez referencję do klasy bazowej kompilator mógł sam zdecydować jaka metoda ma być wywołana względem referującego obiektu. Ok. Teraz spróbujemy przyswoić sobie prosty przykład, jak to działa:

Początek kodu:
using System;


class PoziomA
{
public virtual void Metoda1()
{
Console.WriteLine(„Metoda wywołana z klasy PoziomA”);
}
}


class PoziomB : PoziomA
{
public override void Metoda1()
{
Console.WriteLine(„Metoda wywołana z klasy PoziomB”);
}
}


class PoziomC : PoziomA
{
public void Metoda1()
{
Console.WriteLine(„Metoda wywołana z klast PoziomC”);
}
}

class Pokaz
{
public static void Main()
{
PoziomA baza;
PoziomA PA = new PoziomA();
PoziomB PB = new PoziomB();
PoziomC PC = new PoziomC();


baza = PB;


baza.Metoda1();


baza = PC;

baza.Metoda1();


baza = PA;


baza.Metoda1();

}

}

Koniec kodu:

W powyższym, przykładzie jest ukazane działanie metod wirtualnych. W klasie PoziomA deklarujemy metode wirtualną, klasa ta jest klasą bazową dla klasy PoziomB i PoziomC. Klasa PoziomB jest klasą wyprowadzoną z klasy PoziomA, także w klasie PoziomB deklarujemy metodę Metoda1() która to przykrywa metodę w klasie bazowej, korzystając z referencji do klasy bazowej to właśnie ta metoda z klasy PoziomB zostanie wywołana. Jeżeli jakaś klasa nie przykrywa metody wirtualnej to zostanie wywołana ta z klasy bazowej, jak widzisz dzieje się tak w przypadku klasy PoziomC w której to nie przykrywamy metody Metoda1() i korzystając z referencji do klasy bazowej w przypadku klasy PoziomC jest wywoływana Metoda1() z klasy bazowej gdyż klasa PoziomC nie przykrywa jej tak jak to czyni klasa PoziomB. Teraz prześledź sobie przykład na którym to bardziej przyswoisz działanie metod wirtualnych:

Początek kodu:
using System;


class DwaD
{
public int x;
public int y;


public DwaD(int podaj_x, int podaj_y)
{
x = podaj_x;
y = podaj_y;
}


public virtual double Pole()
{
return x * y;
}
}


class Kwadrat : DwaD
{
public Kwadrat(int bok_a) : base(bok_a, bok_a)
{
}
}


class Trojkat : DwaD
{
public int c;
public double h;


public Trojkat(int bok_a, int bok_b, int bok_c, double wysokosc)
: base(bok_a, bok_b)
{
c = bok_c;
h = wysokosc;
}


public override double Pole()
{
return 0.5 * x * h;
}


}


class Pokaz
{
public static void Main() {
DwaD figura = new DwaD(3, 3);


string wybor = „” ;


Console.WriteLine(„Wybierz figurę:\n1 – Kwadrat\n2 -Trójkąt\n”);
Console.Write(„Twój wybór to: „);
wybor = Console.ReadLine();


switch(wybor){
case „1″ :
figura = new Kwadrat(10);
break ;
case „2″ :
figura = new Trojkat(10,6,7,Math.Sqrt(11));
break ;
default :
Console.WriteLine(„Zły wybór”);
break ;
}
Console.WriteLine(„Pole figury: ” + figura.Pole());
}
}

Koniec kodu:

W powyższym przykładzie stworzyliśmy pewną hierarchię klas, ale nie to jest ważne. Ważne są nasze metody wirtualne. Utworzyliśmy klasę DwaD która to z założenia przechowuje zmienne x i y, gdyż w przestrzeni DwaD wszystko posiada swoje koordynaty x i y, takie jest przeznaczenie klasy, zawiera też ona metodę Pole, jest to metoda wirtualna która to liczy pole figury, bo najprostszym sposobem jest pomnożenie boków figury (czworokąta). Jeżeli jakaś klasa wyprowadzona nie przykryła tej metody Pole to zostanie wywołana metoda z klasy bazowej. Teraz wyprowadziliśmy taką klasę jak Kwadrat, po co tworzyć dla tej klasy metodę Pole() skoro może to wykonać metoda z klasy bazowej, liczenie pola kwadratu czy prostokąta opiera się na tym samym. Następne klasa wyprowadzona to klasa Trojkat, klasa ta deklaruje swoje unikatowe zmienne takie jak wysokość oraz bok c przecież trójkąt zwiera takie coś jak wysokość oraz bok c.  Oraz przykrywa metodę Pole(), ponieważ w trójkącie liczy się inaczej pole niż w czworokątach. Następnie nasza klasa Pokaz ukazuje nam jak działa ten mechanizm, tworzymy sobie obiekt klasy DwaD następnie przypisujemy mu referencję w sposób taki trochę „dynamiczny”. Dzięki temu mechanizmowi to nie język programowania jest ograniczeniem w tworzonych programach tylko twórczość programisty. Dodam jeszcze bo mogłem o tym nie wspominać, otóż metoda Sqrt() zwraca nam pierwiastek kwadratowy oczywiście jako double.