2010-11-23 5 views
5

Ich habe eine Vererbungskette, die aus drei Klassen A, B und C besteht, wobei A und B abstrakt sind und C eine konkrete Implementierung von B ist.C# Überschreibe eine Basisklassenmethode mehr als eine abgeleitete Klasse in der Vererbungskette

ich habe eine virtuelle Methode auf der Basis abstrakten Klasse A, Foo(), die ich C. in der konkreten Klasse außer Kraft setzen möchte

Wenn ich versuche, und nur in der Klasse C überschrieben sie nie abgeholt werden und verwendet immer die Standard-Basisklassenimplementierung, aber wenn ich sowohl B & C überschreibe, wird immer nur die B.Foo() Implementierung der virtuellen Methode verwendet.

Muss ich etwas extra auf B.Foo() außer "override" deklarieren?

Offensichtlich sind diese Versionen meiner Klassen vereinfacht, aber hier sind meine Methode Erklärungen:

abstract class A { 
    protected virtual string Foo() { 
    return "A"; 
    } 
} 

abstract class B : A { 
    protected override string Foo() { 
    return "B"; 
    } 
} 

class C : B { 
    protected override string Foo() { 
    return "C"; 
    } 
} 
+0

haben Sie versucht, die Prüfung der vereinfachten hätte Version Ihrer Klassen? –

+1

Wie rufen Sie Foo an?() auf Klasse C? Ich habe versucht, mit Ihrer Probe zu reproduzieren und war nicht in der Lage. – Jason

+0

Ich hatte das gleiche Problem wegen anderer Fehler. Sobald diese behoben waren und ich neu aufgebaut habe ging der Fehler weg. – Danielson

Antwort

5

Huh?

void Main() 
{ 
    new C().DumpFoo(); // C 
    A x=new C(); 
    x.BaseDumpFoo(); //C 
} 

abstract class A { 
    protected virtual string Foo() { 
    return "A"; 
    } 
    public void BaseDumpFoo() 
    { 
    Console.WriteLine(Foo()); 
    } 
} 

abstract class B : A { 
    protected override string Foo() { 
    return "B"; 
    } 
} 

class C : B { 
    protected override string Foo() { 
    return "C"; 
    } 
    public void DumpFoo() 
    { 
    Console.WriteLine(Foo()); 
    } 
} 

Ausgabe ist C. Entfernen Foo Implementierung von B und der Ausgang ist noch C

+0

In der Tat sollte ich versuchen, die Dinge sorgfältiger zu lesen. Wenn "A" als abstrakt deklariert ist, bin ich mir nicht sicher, wie der beschriebene Fall reproduzierbar ist. +1 –

-3

Das Problem ist, dass, da B die Methode überschreibt, wenn es von C nennen, es nie
in der Vererbungshierarchie zu ihrer Umsetzung erreicht , was Sie tun müssen, ist definieren das Verfahren in B wie neu (so dass sie die Umsetzung von A überschreibt) und definieren es als virtuelle auch (so dass C verwenden es eine eigene Implementierung ist Sie so etwas wie dieses

abstract class A 
{ 
    protected virtual string Foo() 
    { 
     return "A"; 
    } 
} 

abstract class B : A 
{ 
    protected new virtual string Foo() 
    { 
     return "B"; 
    } 
} 

class C : B 
{ 
    protected override string Foo() 
    { 
     return "C"; 
    }