Rezervirana beseda new

Ejla!
Zanima me predvsem rezervirana beseda new pri dedovanju.

Primer:
public class A
{
         public void Start()
        {
               Console.WriteLine("Test A");
        }
}

public class B : A
{
       public new void Start()
      {
             Console.WriteLine("Test B");
       }
}


Ce zdaj jz prav razumem, mi prevajalnik skrije metodo iz dedovanega razred, ko poklicem instanco razreda B.

B razredB = new B();
B.Start();


Zdaj, zanima me, če pokliče tudi metodo iz A?

Če prav razumem, je nebi smel. Ko pa debug-am, mi pa skoči v A. Ali sem to narobe razumel?

Avtor: bojanv, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

bojanv
bojanv - sreda, 15. marec 2006

Na zalost sem vezan na isto ime....ni panike...bom nardil pa brez dedovanja....

AndrejT
AndrejT - sreda, 15. marec 2006

Vsekakor mi je osebno ljubša rešitev uporaba metode z drugim imenom; je bolj jasno in tudi razumljivo... V tvojem primeru pa si verjetno spet vezan na to, da moraš uporabiti isto ime.

MihaM
MihaM - sreda, 15. marec 2006

Potem pa niti nimaš izbire: ali new ali pa metoda z drugim imenom.

bojanv
bojanv - sreda, 15. marec 2006

To mi je jasno....najvecji problem je tukaj, da ne smem spreminjati razreda, od katerega dedujem....ker drugace bi dal virtual spredaj, v dedovanem override pa bi bla stvar resena....

AndrejT
AndrejT - torek, 14. marec 2006

Mogoče je vaš problem podoben zgornjemu primeru... Skrivanje metod z new je lahko nevarno - dedovan razredB ima v tvojem primeru dve metodi Start(): svojo in tisto osnovnega razreda. Če pa v razredu B metodo Start() razreda A enostavno prekriješ (override), zagotoviš, da se bo vedno izvajala metoda dedovanega razreda B [seveda pa znotraj nje lahko pokličeš tudi metodo osnovnega razreda A].

bojanv
bojanv - torek, 14. marec 2006

Torej sem imel prav.... ja, razredB.Start(); je , tipkarska napaka..... sej zaradi tega se gre...ko smo probali v debug-u, nam je skoclo v razred A, kar mi pa ni jasno zakaj je to nardil....mogoce je pa kaksen bug to razumem, ce bi sel nivo nizje, da bi poklical metodo iz razreda, ki ga dedujemo.... kul, hvala za informacije...dobro, da si nisem zmesal pojmov...

AndrejT
AndrejT - torek, 14. marec 2006

Metoda Start razreda B (označena z besedo new) v tvojem primeru skrije metodo v razredu A. Metoda razreda A se v tem primeru ne bi smela izvajati. Si prepričan, da gre proces v debug modu skozi razred A? Če pa izvedeš naslednjo kodo: A razredB = new B(); razredB.Start(); ...potem pa res pokličeš metodo Start razreda A. BTW: vrstica v tvojem primeru bi se morala brati razredB.Start();?