problem ze zrozumieniem rzutowania

0
 
  class A
        {
            public  int x = 23;

            public virtual string getme()
            {
                return "klasa A";
            }
        }

        class B : A
        {
            new public  int x = 45;

            public override string getme()
            {
                return "klasa B";
            }

            public int getBaseX()
            {
                return base.x;
            }

        }

Wywołuje
1:

  
b.x = 107;
a = (A)b;
richTextBox1.AppendText("\na=" + a.x.ToString() + "  me = " + a.getme());

2:

  
b.x = 107;
a = (B)b;
richTextBox1.AppendText("\na=" + a.x.ToString() + "  me = " + a.getme());

Dlaczego w obu przypadkach wypisuje "a=23 me = klasa B"? Nie rozumiem rzutowania. Ktoś wyjaśni?

0

Bo dla metoda wirtualnych nie jest ważny typ referencji, ale typ obiektu na jaki wskazuje referencja. Dla wirtualnych metod to co jest wywoływane jest ustalane na etapie wykonywania programu, a nie podczas kompilacji.

PS> Dla x masz jakby zwykła metodę pobierającą wartość x i to jest ustalane na podstawie typu referencji w fazie kompilacji.

0

a = (A)b;

jeśli a jest typu A, a b jest typu B, to to rzutowanie jest niepotrzebne – już zapis a = b; jest poprawny i znaczy to samo co a = (A)b;

a = (B)b;

jeśli a jest typu A, a b jest typu B, to to rzutowanie nic nie robi (rzutujesz B na B), po czym dokonuje się niejawne rzutowanie B na A jak w punkcie wyżej.

te dwa zapisy są więc całkowicie równoważne, dlatego dostajesz ten sam wynik.

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