Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 5 odgovora
  • 3.469 pregleda

Najnovija ↓

C# kako ovaj kod radi? 14.11.2010. u 20:22 · pre 194 meseca #1
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();
        }


Re: C# kako ovaj kod radi? 14.11.2010. u 20:47 · pre 194 meseca #2
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
Potpis
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ć
Re: C# kako ovaj kod radi? 15.11.2010. u 01:04 · pre 194 meseca #3
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?
Re: C# kako ovaj kod radi? 15.11.2010. u 02:01 · pre 194 meseca #4
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.
Re: C# kako ovaj kod radi? 15.11.2010. u 08:26 · pre 194 meseca #5
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
Potpis
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ć
Re: C# kako ovaj kod radi? 15.11.2010. u 13:51 · pre 194 meseca #6
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme