Podstawy tworzenia obiektów + dziedziczenie

0

Witam, mam banalny przykład, i chciałbym w 100% zrozumieć jak to hula.

public class Zwierze
    {
        public virtual void Print()
        {
            Console.WriteLine("Zwierze");
        }

    }

    class Krowa : Zwierze
    {
        public override void Print()
        {
            Console.WriteLine("Krowa");
        }
    }

    class Cielak : Krowa
    {
        public new void Print()
        {
            Console.WriteLine("Cielak");
        }


            Zwierze z = new Cielak();
            z.Print();
            Console.ReadLine();

Jak to jest, że widzę tu krowe?
Może mi ktoś wytłumaczyć, co tak naprawdę jest po lewe stronie ('Zwierze z'), a co po prawej ('new Cielak();')?
Na mój rozum, wydaje mi sie to tak:

Po lewej mamy typ obiektu, po prawej referencję.
Następnie dochodzimy do momentu, kiedy chcemy wywołać metodę Print(), i dochodzi nam do sytuacji, że słówko kluczowe 'new' powoduje, że zamiast wywołać Cielak.print(), leci krowa.print().
Jednak, jak stworzymy sobie Cielak c = new Cielak() to już słówko new nie przeszkadza. Prosił bym o wyjasnienie tej sytuacji :)

2

Rozpatruj to od drugiej strony:

Zwierze z = new Cielak();
z.Print();

z jest typu Zwierze.
Zwierze.Print() jest virtual i jest przesłonięta (override) przez Krowa.Print(). Więc ta metoda zostaje wywołana.

Cielak c = new Cielak();
c.Print();

c jest typu Cielak.
Cielak.Print() ma modyfikator new więc zastępuje metody klas bazowych. I to ona jest wywołana.

0
Delor napisał(a):

Rozpatruj to od drugiej strony:

Zwierze z = new Cielak();
z.Print();

z jest typu Zwierze.
Zwierze.Print() jest virtual i jest przesłonięta (override) przez Krowa.Print(). Więc ta metoda zostaje wywołana.

Cielak c = new Cielak();
c.Print();

c jest typu Cielak.
Cielak.Print() ma modyfikator new więc zastępuje metody klas bazowych. I to ona jest wywołana.

Dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1