1

同じメソッドを共有する2つのクラスがあり、要件に応じてコードでそれらを切り替えたいと思います。以下の例を見ると、コードの同じ部分が重複していることがわかります。CacheFileクラスとCacheMemoryクラスは同じです。このコードを縮小して、CacheFileクラスとCacheMemoryクラスを切り替えることができると確信しています。

    if (_cacheLocation == CacheLocation.File)
    {
        if (!CacheFile.Get(key, out value))
        {
            // Do lookup based on caller's logic.   
            context.Proceed();
            value = context.ReturnValue;
            CacheFile.Add(value, key, _cacheType, _expiry);
        }
    }

    if (_cacheLocation == CacheLocation.Memory)
    {
        if (!CacheMemory.Get(key, out value))
        {
            // Do lookup based on caller's logic.   
            context.Proceed();
            value = context.ReturnValue;
            CacheMemory.Add(value, key, _cacheType, _expiry);
        }
    }
4

4 に答える 4

4

CacheLocationとCacheMemoryに共通のインターフェースを実装させると、個々のクラスの代わりにインターフェースを使用できます。

http://msdn.microsoft.com/en-us/library/ms173156.aspx

于 2012-04-16T15:33:37.977 に答える
2

複製された動作をカプセル化するクラスを使用します(この動作を公開するインターフェースを定義します)。CacheLocation.FileとCacheLocation.Memoryに対して目的のアクションを実行する2つのクラスにこのインターフェイスを実装します。

次に、CacheLocationが与えられた場合にICacheを返すファクトリを使用でき、コンシューマーは、その下で使用されている実際のストアの種類を知らなくてもICacheを使用できます。

于 2012-04-16T15:34:35.550 に答える
0

これを処理する方法はいくつかあります。CacheMemoryとCacheFileが相互に継承する場合、または共通の基本クラスを継承する場合は、親クラスの変数を宣言して操作できます。あるいは、一方を他方から(または両方を共通ベースから)派生させたくない場合は、両方に共通インターフェースを実装させ、インターフェースのインスタンスとして宣言された変数を使用させることができます。

于 2012-04-16T15:35:21.193 に答える
0

以下のようにインターフェースを定義し、そこからCacheFileとCacheMemoryを継承することができます。

public interface ICache
{
   Get();
   Add();
}

コードの膨張を減らすことができます。

于 2012-04-16T15:37:01.223 に答える