[ Radenko123 @ 14.11.2010. 19:22 ] @
Promenljive a, b, c, d sve sadrze referencu na isti objekat klase D. Zar ne bi onda trebalo da se u sva cetiri slucaja pozove metoda Ispis() objekta D, na ekranu ispise DDDD, bez obzira na override. Umesto toga ispisuje se DDBB. Jel moze ovo neko da rastumaci za mene?

Tnx.

Code:
public class A
        {
            public virtual void Ispis() { Console.Write("A"); }
        }
        public class B : A
        {
            public override void Ispis() { Console.Write("B"); }
        }
        public class C : B
        {
            new public virtual void Ispis() { Console.Write("C"); }
        }
        public class D : C
        {
            public override void Ispis() { Console.Write("D"); }
        }

        static void Main(string[] args)
        {
            D d = new D(); 
            C c = d; 
            B b = c; 
            A a = b;
            d.Ispis(); 
            c.Ispis(); 
            b.Ispis(); 
            a.Ispis();
            Console.ReadKey();
        }


[ mmix @ 14.11.2010. 19:47 ] @
Dodao si "new", samim tim si prekinuo v-table nasledjivanje, C i D klase imaju svoj Ispis A i B svoj, a onaj iz C "sakriva" onaj iz B/A
[ Radenko123 @ 15.11.2010. 00:04 ] @
Evo razmislih malo posle tvog objasnjenja (trebalo mi je sat vremena, zapravo :)), i opet mi malo mutno. Ako sam dobro slozio kockice:

prilikom izvrsenja, na liniji koda b.Ispis(); kompajler je jos prilikom kompilacije odredio da posto metod Ispis() klase C, sakriva metod Ispis klase B, da se kod izvrsenja programa uz promenljivu tipa b uvek poziva metod klase B, bez obzira na tip objekta na koji promenljiva b ukazuje. A na sledecoj liniji koda a.Ispis(); tek nije logicno da se pozove metoda objekta klase D jer je to samo override metode Ispis klase C koja sakriva metod Ispis klase B...

Ovde sad imam nedoumicu, jer je promenjiva "a" tipa A, a u trenutku izvrsenja ove linije koda ukazuje na objekat klase D, pa prema tome posto se "D" sigurno nece ispisati, zasto se ne ispise "A", tj. na osnovu cega se ispisalo "B"? Da li to znaci da se prilikom izvrsenja, posto ne moze da se izvrsi metoda Ispis() klase D, ni metoda klase C, uzima metoda Ispis() klase koja je prva sledeca u hijerarhiji nasledjivanja tj. klase B?
[ lonelyrider_44 @ 15.11.2010. 01:01 ] @
Metod Ispis klase C, sakriva metodu Ispis klase B, samo kada su objekti tipa klase C u pitanju. U ostalim sluchevima se poziva metoda koju je klasa C nasledila, a to je Ispis, klase B.

Code (csharp):

...
C c = new C();
C cc = c;
B b = cc;
A a = c;

c.Ispis();// "C"
cc.Ispis();// "C"
b.Ispis();// "B"
a.Ispis();// "B"

 


Dakle, metod Ispis klase C, vazi samo za objekte klase C.
[ mmix @ 15.11.2010. 07:26 ] @
Problem je sto o tome razmisljas kao o ISTOM nasledjenom metodu a on to nije, to je potpuno drugi metod samo se isto zove. Cak ima i posebno mesto u v-table, zato i printa "B" u (a/b).ispis

Zamisli da se A.Ispis zove u stvari A.Ispis001, a C.Ispis se zove C.Ispis002 i kompajler vidi samo prvih 5 slova. :) Posto onda vidi dve funkcije Ispis poziva onu koja je bliza deklarisanom tipu. Dakle D.Ispis ce zvati Ispis002 B.Ispis ce zvati Ispis001
[ Radenko123 @ 15.11.2010. 12:51 ] @
Hvala vam, mislim da mi je jasno:
Ovo me je poslednje bunilo:

Code:

            D d = new D();
            A a = d;
            a.Ispis();
            Console.ReadKey();


Ovde bi bila pozvana metoda Ispis objekta koji promenljiva a referencira, da sa new nije prekinuto v-table nasledjivanje. Zato se uzima metoda Ispis klase koju je klasa, u kojoj je napravljena ta nova metoda sa istim imenom (Ispis002), nasledila, tj metoda Ispis klase B.