2015-04-27 13 views
5

Frage ist sehr kurz, aber ich habe keine Lösung gefunden.Override Overlapped-Methode

Angenommen wir die Klassenhierarchie haben

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"; } 
} 

Ist es möglich, A.Print in C-Klasse außer Kraft zu setzen? Ich habe versucht, es als explizite Schnittstellenimplementierung zu tun:

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

aber hier bekomme ich eine Fehlermeldung:

'A' in explicit interface declaration is not an interface

Ich denke, es ist gar nicht möglich, würde aber zu schätzen wissen alle zusätzlichen Informationen empfangen

+0

Ihre Frage ist markierte sowohl C# als auch CIL. Möchtest du das in C# machen oder bist du offen dafür C in CIL zu schreiben? – svick

+0

@svick, weil ich nicht sicher bin, ob es in C# oder IL möglich ist oder nicht, also sieh dir Brians Antwort an. Jetzt bekommen Sie, warum ich Cil-Tag zu der Frage hinzugefügt :) –

Antwort

5

Sie können nicht in C#, aber Sie können in IL durch Verwenden Sie das Schlüsselwort .override, um zu überschreiben, welchen Vtable-Slot die Methode verwenden soll. (Anmerkung: der Methodenname Namespace.A.Print ist nicht von Bedeutung, einschließlich der vollständigen Typnamen in dem Namen der Methode ist nur eine nützliche Methode, Kollisionen zu vermeiden, auf die gleiche Art und Weise wie C# für explizite Schnittstellenimplementierungen tut)

.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

Für die Verwendung von IL, +1! Purer Badassery :) –

1

Ich habe es nicht ausprobiert, aber Sie könnten einfach -

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"; } 
}