3

クラス設計について質問です。現在、私は次の構造を持っています:

抽象ベース リポジトリ クラス

デフォルトのリポジトリ実装クラス (いくつかの抽象メソッドを実装します。ロジックはすべての特定のクラスに共通ですが、その他は空のままにします)

特定のリポジトリ実装クラス (上記の Default クラスで空のままになっているものを実装します)

特定のクラスに特定の Update() メソッドがあるという問題が発生しましたが、このメソッドのすべてのコードが実行されると、基本の Default クラスのコードも実行する必要があります。

私はこのようにすることができました

public override Update()
{
    // do Specific class actions and updates
    // ....

    // follow with base.Update()
    base.Update();
}

ただし、これには、継承されたすべてのメソッドでこれらの base.XYZ() 呼び出しが必要です。どういうわけかパーシャルでそれを回避できますか?

したがって、要件は、親クラスと継承クラスの両方にコードを含める (またはパーシャルを使用してこれら 2 つの 1 つのクラスにする) ことと、両方の場所でメソッド実装のコードを実行することです。また、元に戻して、最初に基本クラス コードを実行し、その後に継承されたクラス コードを実行したい場合はどうすればよいでしょうか?

ありがとう

4

5 に答える 5

8

次のようなことを考えましたか:

public abstract class YourBaseClass
{
    public void Update()
    {
        // Do some stuff
        //

        // Invoke inherited class's  method
        UpdateCore();
    }

    protected abstract void UpdateCore();
}

public class YourChildClass : YourBaseClass
{
     protected override void UpdateCore()
     {
         //Do the important stuff
     }
}


//Somewhere else in code:
var ycc = new YourChildClass();
ycc.Update();
于 2010-01-13T12:07:56.350 に答える
3

すべてのpartialキーワードの意味は、クラスの定義がソース ファイル間で分割されていることです。

クラスまたは構造体、インターフェイス、またはメソッドの定義を 2 つ以上のソース ファイルに分割することができます。各ソース ファイルには型またはメソッド定義のセクションが含まれており、アプリケーションのコンパイル時にすべての部分が結合されます。

プロジェクトにはクラスの完全な定義が必要です。

特定のメソッドをオーバーライドできるように、サブクラスを作成することをお勧めします。

部分メソッドに関する限り(上記と同じリンクから):

部分メソッド宣言は、定義と実装の 2 つの部分で構成されます。これらは、部分クラスの別々の部分にある場合もあれば、同じ部分にある場合もあります。実装宣言がない場合、コンパイラは定義宣言とメソッドへのすべての呼び出しの両方を最適化します。

// Definition in file1.cs
partial void onNameChanged();

// Implementation in file2.cs
partial void onNameChanged()
{
  // method body
}

メソッドの半分を 1 つのファイルに格納し、残りの半分を別のファイルに格納することはできません。

于 2010-01-13T12:05:18.463 に答える
2

これを行う方法は次のとおりです。

public sealed override void Update()
{
    UpdateCore();
    base.Update();
}

public abstract /* or virtual */ void UpdateCore()
{
    // Class-specific stuff
}
于 2010-01-13T12:05:20.940 に答える
1

まったく異なるセマンティクスを持つ部分的なことは忘れてください。仮想基本クラス メソッドのオーバーライドが基本クラス メソッドを呼び出すかどうかは、自動ではありません。ドキュメントの一部にする必要があります。良い例は Control クラスの OnXxxx() メソッドです。MSDN ライブラリ ドキュメントには、基本クラス メソッドの呼び出しが通常は必要であることを警告する「実装者への注意」コメントがあります。

基本クラスのメソッドを抽象化すると、オーバーライド者にとって非常に明確になります。そうでない場合は、それを行う必要があるという強いヒントを落としていることになります。オーバーライドが基本実装を完全に置き換えると予想される場合は、オーバーライドを抽象化することを検討する必要があります。このあいまいさと、オーバーライド者が誤ってオーバーライドして基本クラスを壊してしまう可能性が相まって、間違いなくポリモーフィズムの弱点の 1 つです。

于 2010-01-13T12:18:33.840 に答える
0

独自の実装の上に独自の追加ステップを持つ継承者に対応するために、新しい仮想 (すべての特定の実装がそれをオーバーライドする必要があるわけではないため、抽象的ではない?) メソッドを Default 実装に追加します。

デフォルト実装の抽象メソッド実装の適切なポイントで仮想メソッドを呼び出します。

抽象クラスをそのままにして、デフォルト実装の柔軟性を透過的に拡大しました。

于 2010-01-13T12:44:01.527 に答える