Witam Wszystkich
Od jakiegoś czasu staram się pisać w C# i mam pewną kwestię, którą nie do końca kumam.
mam oto zadeklarowane ćwiczebnie klasy
public class A
{
public virtual string pisz(bool showBase = false)
{
return "Klasa A";
}
}
public class B:A
{
public override string pisz(bool showBase = false)
{
return "Klasa B--"+ ((showBase == true) ? base.pisz() + "." : "");
}
}
public class C:B
{
public **sealed** override string pisz(bool showBase = false)
{
return "Klasa C--" + ((showBase == true) ? base.pisz() + "." : "");
}
}
public class D:C
{
public **new** string pisz(bool showBase=false)
{
return "Klasa D--"+((showBase==true)?base.pisz() + ".":"");
}
}
tak, że A jest klasą nadrzędną bazową dla B, C dziedziczy z B, a D dziedziczy z C. Z tymże w klasie C mam metodę która jest sealed i zgodnie z tym nie powinno być możliwości jej nadpisania. Teraz tworzę obiekty jak poniżej:
A a = new A();
B b = new B();
C c = new C();
D d = new D();
A aa = new A();
A ab = new B();
A ac = new C();
A ad = new D();
txtConsole.Text += "\r\n" + a.pisz(true);
txtConsole.Text += "\r\n" + b.pisz(true);
txtConsole.Text += "\r\n" + c.pisz(true);
txtConsole.Text += "\r\n" + d.pisz(true);
txtConsole.Text += "\r\n---------------------------------";
txtConsole.Text += "\r\n" + aa.pisz(true);
txtConsole.Text += "\r\n" + ab.pisz(true);
txtConsole.Text += "\r\n" + ac.pisz(true);
txtConsole.Text += "\r\n" + ad.pisz(true);
txtConsole.Text += "\r\n---------------------------------";
txtConsole.Text += "\r\n" + ad.pisz();
I w pierwszym sposobie (obiekty a,b,c,d) gdzie typem obiektu jest jego klasa to wynikiem działania jest:
Klasa A
Klasa B--Klasa A.
Klasa C--Klasa B--.
Klasa D--Klasa C-->
Natomiast w drugim sposobie gdzie typem jest A (obiekty aa,ab,ac,ad) wynik to:
Klasa A
Klasa B--Klasa A.
Klasa C--Klasa B--.
Klasa C--Klasa B--.>
Czyli, wygląda na to, że przy wywołaniu obiektu d.pisz() wywoływana jest nadpisana metoda pisz w klasie D, natomiast w ad.pisz() wywoływana jest metoda nienadpisana.
Może mi ktoś wyjaśnić dlaczego
Dziękuję i pozdrawiam.
Tomek