override comportamento risoluzione in c # [chiuso]

-3

Ho provato il seguente pezzo di codice

public abstract class Entry3
{
    public abstract void Method1();
    public virtual void Method2() { Console.WriteLine("Entry3.Method2"); }
}

public abstract class Entry31 : Entry3
{
    public override void Method1()
    {
        Console.WriteLine("Entry31.Method1");
    }
    public virtual void Method2() { Console.WriteLine("Entry31.Method2"); }
}

public class Entry32 : Entry31
{
    public override void Method1()
    {
        Console.WriteLine("hi");
    }
    public override void Method2() { Console.WriteLine("Entry32.Method2"); }
}

public class Main4
{
    public static void Main()
    {
        Entry32 e32 = new Entry32();
        e32.Method1();

        //((Entry31)e32).Method1();
        ((Entry3)e32).Method1();

        e32.Method2();
        ((Entry31)e32).Method2();
        ((Entry3)e32).Method2();

        Console.ReadKey();
    }
}

La risposta era "Entry3.Method2" per l'ultima riga ((Entry3)e32).Method2(); . Ho scavalcato la base Entry31 Method2 in Entry32. C # sta rilevando che Entry3 Method2 non viene sovrascritto in Entry32 e chiama Entry3.Method2. Qualcuno può aiutarmi a capire questo comportamento

    
posta Saravanan 12.04.2015 - 18:21
fonte

1 risposta

1

Entry32::Method2 sostituisce Entry31::Method2 , non Entry3::Method2 . Poiché la catena di override è interrotta tra Entry3 e Entry31 (è un'ombra - funzioni completamente diverse per quanto riguarda il runtime) la spedizione virtuale non vi passa.

    
risposta data 12.04.2015 - 18:34
fonte

Leggi altre domande sui tag