2016-11-03 11 views
0

申し訳ありませんが、これが愚かな質問である場合、または既に質問されている場合は、C#のメソッドは、別のメソッドをオーバーライドして同時に仮想化できますか?

画像を、このシナリオ:

public class Bottom 
{ 
    virtual public void foo() 
    { 
     doTheThing(); 
    } 
} 

public class Middle : Bottom 
{ 
    virtual override public void foo() //this function will both override the parent's foo() and letting its child's foo() be over ridden 
    { 
     base.foo(); 
     doTheOtherThing(); 
    } 
} 

public class Top : Middle 
{ 
    override public void foo() 
    { 
     base.foo(); 
     doTheFinalThing(); 
    } 
} 

と真ん中の1になるので、ここで...私の周りグーグルで試したと私は今、この権利をテストすることができるようにする位置には本当にないんだけどコメントは、私が求めているものです。

これは問題ありませんか?それは従来のものですか?正しい順序でキーワードが表示されていますか?それは問題ですか?これを行う最も正しい方法は何ですか?

+0

バーチャルな方法は、バーチャルな方法ですが、そのために何もする必要はありません。だから、単に中間のバージョンから "仮想"キーワードを削除してください。 – Evk

+0

質問をする前に、興味のあるコードをコンパイルしてみてください。あなたのコードは現在、コンパイル時にエラーが出るでしょう。 –

+1

[documentation](https://msdn.microsoft.com/en-us/library/ebca9ah3.aspx)をチェックしてください: "オーバーライドメソッドを変更するために新しい、静的、または仮想修飾子を使用することはできません。オーバーライドされたプロパティは、仮想、抽象、またはオーバーライドでなければなりません。 –

答えて

0

下の基底クラスで定義された仮想メソッドは、メソッドが仮想であり、呼び出されたメソッドが最も派生した実装を実行することを意味します。この動作は、すべてのオーバーライドによって継承されます。

これは、「オーバーライド」キーワードを指定する必要があることを意味します。基本メソッドは既にそれが仮想であることを確認しているので、オーバーライドで再度指定する必要はありません。コンパイラはあなたにもそれを許可しません。

また、多くの人は、「相続よりも構成を好む」と主張しますが、それは別の議論です。あなたのように複数の上書きを行うのは大丈夫です。

関連する問題