Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C# kako ovaj kod radi?

[es] :: .NET :: C# kako ovaj kod radi?

[ Pregleda: 2423 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Radenko123

Član broj: 186100
Poruke: 18
*.dynamic.isp.telekom.rs.



Profil

icon C# kako ovaj kod radi?14.11.2010. u 19:22 - pre 132 meseci
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();
        }


 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6021



+4620 Profil

icon Re: C# kako ovaj kod radi?14.11.2010. u 19:47 - pre 132 meseci
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
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Radenko123

Član broj: 186100
Poruke: 18
*.dynamic.isp.telekom.rs.



Profil

icon Re: C# kako ovaj kod radi?15.11.2010. u 00:04 - pre 132 meseci
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?
 
Odgovor na temu

lonelyrider_44
Zrenjanin

Član broj: 42310
Poruke: 445
109.94.104.*



+20 Profil

icon Re: C# kako ovaj kod radi?15.11.2010. u 01:01 - pre 132 meseci
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.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6021



+4620 Profil

icon Re: C# kako ovaj kod radi?15.11.2010. u 07:26 - pre 132 meseci
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
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Radenko123

Član broj: 186100
Poruke: 18
*.dynamic.isp.telekom.rs.



Profil

icon Re: C# kako ovaj kod radi?15.11.2010. u 12:51 - pre 132 meseci
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.
 
Odgovor na temu

[es] :: .NET :: C# kako ovaj kod radi?

[ Pregleda: 2423 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.