2015-04-27 2 views
5

Вопрос очень короткий, но я не нашел решения.Переопределенный метод перекрытия

Предположим, что мы имеем иерархию классов

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

Можно ли переопределить A.Print в классе C? Я пытался сделать это в качестве явной реализации интерфейса:

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

, но здесь я получаю сообщение об ошибке:

'A' in explicit interface declaration is not an interface

Я думаю, что это вообще невозможно, но хотел бы получить любую дополнительную информацию

+0

Ваш вопрос помечены как C#, так и CIL. Вы хотите сделать это на C# или вы можете писать C 'в CIL? – svick

+0

@svick, потому что я не уверен, возможно ли это или нет в C# или IL, поэтому см. Ответ Брайана. Теперь вы поняли, почему я добавил тег cil к вопросу :) –

ответ

5

Вы не можете в C#, но вы можете в IL используя ключевое слово .override для переопределения того слота vtable, который будет использовать метод. (Примечание: имя метода Namespace.A.Print не имеет существенного значения, в том числе полное имя типа в имени метода является просто полезным способом избежать столкновений, точно так же, как C# делает для явных реализаций интерфейса)

.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

Для использования ИЛ, +1! Чистое оскорбление :) –

1

Я не пробовал, но вы могли бы легко -

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