どのように振る舞いを変えずに仮想メソッドを上書きするのですか?

メソッドをオーバーライドするときは、メソッドの動作を変更しないでください。したがって、オーバーライドされたメソッドで base.MyVirtualMethod()を呼び出して、特殊化コードを追加する必要があります。

しかし、私はいつも base.MyVirtualMethod()を呼び出さなければならないと思っています。または別の視点から、仮想メソッドをどのように記述すればよいですか?ユーザーがオーバーライドされたメソッドの最初または最後のものと呼ぶと思いますか?

public class Parent
{
    public virtual void MyMethod(){ /* Some code*/ }
}
public class Child : Parent
{
    public override void MyMethod()
    {
        /* Does my code goes here? */
        base.MyMethod();
        /* Or does my code goes here? */
    }
}
2
base.MyMethod()が呼び出されるワークフロー内の場所は固定されていますか?つまり、 base.MyMethod()の前後にいくつかのコードがあります
追加された 著者 Abdul Munim,
これはプログラマーの洞察に完全に依存しています。コードは、基本実装の呼び出しの前または後になります。
追加された 著者 bert-jan,

6 答え

したがって、オーバーライドされた場所でbase.MyVirtualMethod()を呼び出す必要があります。   メソッドを作成し、特殊コードを追加します。

これは必ずしも真実ではありません。スーパークラスが行っていることを派生クラスでやりたくない場合は、 base を呼びたくない場合があります。

基本動作を拡張したい場合は、実際の問題に応じて base の前後にコードを配置します。 「あなたのコードの前に常にベースを置く」というルールはありません。

4
追加された

ベースコールは存在しません 。ドキュメンテーションで、ベースコールが他のコードの前にあるべきか、他のコードの後ろにあるべきか、どちらにもなくても(存在しない)、そして他のコードの性質が正確であるべきかどうかを指定することができます。これはすべてあなたが達成しようとしているものに依存します。

追加コードの最適な場所が実際にベースコールのどこかにあることがわかった場合、それはベースメソッドを2つ以上のメソッドに分割する必要があることを意味します。

2
追加された

あなたの質問に正確に答えるには:それを上書きしないでください:あなたがそれを上書きすると、その動作が変更されます。 ほとんどの場合、基本メソッドの呼び出しの下に新しいコードを配置します。これは、この基本動作とその後の追加動作を実行するためです。しかし、これは石で設定されていない、本当にあなたのニーズに依存しています。

1
追加された

答えは、多くの質問と同様に、「それは依存しています」です。

いくつかのデータをファイルに書き込むクラスを拡張しようとしており、その拡張モジュールは SimpleDataFile.writeFile()でExtendedDataFile.writeFileで拡張されたファイルの最後にデータを追加する必要があると仮定します()):このようなシナリオでは、基本メソッドの呼び出しの後にコードを追加します。

あなたの拡張機能が前処理機能を追加したとします。おそらく、 FancyDataFile.writeFile()で拡張された基本ファイル出力( SimpleDataFile.writeFile())そのようなシナリオでは、何かがファイルに送られる前に現実的に行動し、コードはベースコールの前に終わるでしょう。

1
追加された

私は、まず基本メソッドを呼び出して、必要な初期化がすでに行われていることを確認し、実際にはコードが基本的な動作を上書きすることを保証します。 明らかにこれは特定の状況に依存しますが、コードを最初に実行する必要があることがわかっている機会があります。

1
追加された

それはあなたが何をしたいかによって異なりますが、どちらもOKです!

0
追加された