2015-04-27 13 views
5

La domanda è molto breve, ma non ho trovato una soluzione.Override metodo sovrapposto

Supponiamo di avere la gerarchia delle classi

public abstract class A 
{ 
    public virtual string Print() { return "A"; } 
} 

public class B : A 
{ 
    public virtual new string Print() { return "B"; } 
} 

public class C : B 
{ 
    public override string Print() { return "C"; } 
} 

E 'possibile ignorare A.Print in classe C? Ho provato a farlo implementazione dell'interfaccia come esplicita:

string A.Print() { return "C"; } 

ma qui ho un errore:

'A' in explicit interface declaration is not an interface

penso che non è possibile a tutti, ma apprezzerei ricevere qualsiasi informazioni

+0

La tua domanda è taggato sia C# che CIL. Vuoi farlo in C# o sei aperto a scrivere 'C' in CIL? – svick

+0

@svick perché non sono sicuro che sia possibile o meno in C# o in entrambi, quindi guarda la risposta di Brian. Ora capisci perché ho aggiunto il tag cil alla domanda :) –

risposta

5

Non puoi in C#, ma puoi in IL di usando la parola chiave .override per sovrascrivere quale slot vtable utilizzerà il metodo. (Nota: il nome del metodo Namespace.A.Print non è significativo, compreso il nome di tipo completo nel nome del metodo è solo un modo utile per evitare collisioni, nello stesso modo in cui C# fa per le implementazioni di interfaccia esplicite)

.class public auto ansi beforefieldinit Namespace.C 
    extends [x]Namespace.B 
{ 
    .method private hidebysig virtual 
     instance string Namespace.A.Print() cil managed 
    { 
     .override method instance string [x]Namespace.A::Print() 
     .maxstack 1 
     ldstr "C" 
     ret 
    } 
} 
+0

Per l'uso di IL, +1! Puri assurdità :) –

1

Non l'ho provato, ma potresti facilmente:

interface IA 
{ 
    string Print(); 
} 

interface IB 
{ 
    string Print(); 
} 


public abstract class A : IA 
{ 
    IA.Print() { return "A"; } 
} 

public class B : IB, A 
{ 
    IB.Print() { return "B"; } 
}