2010-11-23 10 views
5

A、B、Cの3つのクラスからなる継承チェーンがあります。ここでAとBは抽象であり、CはBの具体的な実装です。C#2つ以上の派生クラスの下位継承チェーンをオーバーライドする

私は私がしようとすると、それは拾わないと常に用途んばかりのクラスCに上書きした場合、私は具象クラスC.

に上書きしたい基本抽象クラスA、Foo()上の仮想メソッドを持っていますデフォルトの基底クラスの実装ですが、B & Cの両方でオーバーライドすると、仮想メソッドの実装はB.Foo()しか使用されません。

「オーバーライド」以外のB.Foo()で何かを宣言する必要がありますか?

明らかにこれらは私のクラスの簡略化バージョンですが、ここに私のメソッド宣言です:

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

のようなものを持っているでしょうが、あなたは、簡略化のテストを試してみましたあなたのクラスのバージョン? –

+1

どのようにあなたはFooに電話していますか?クラスCの()に?あなたのサンプルを使って再現しようとしましたが、できませんでした。 – Jason

+0

私は他のエラーのためにこの同じ問題の問題を抱えていました。それらが修正され、私が再構築されると、エラーは消え去った。 – Danielson

答えて

5

えっ?

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()); 
    } 
} 

出力はCです。 BからFoo実装を削除し、出力はまだ問題はBメソッドをオーバーライドしているので、Cからそれを呼び出すとき、それは継承階層での実装に到達したことがないということだC

+0

実際、私は物事をより慎重に読もうと試みるべきです。抽象的に宣言された 'A'では、記述されたケースがどのように再現可能であるかわかりません。 +1 –

-3

であるあなたが定義されて何をする必要があるか
新品同様Bのメソッド(それはAから実装をオーバーライドするように)と仮想としても、それを定義する(Cはそれが独自の実装 だ使用できるように、あなたはこの

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"; 
    } 
関連する問題