2

確立された2つのレイヤーの間にあるコードを変更していますが、最適なデザインを見つけるのに苦労しています。

現在、コードはファイルアクセスライブラリを呼び出し、呼び出し元にオブジェクトを返します。返されたオブジェクトを拡張して、カスタムの破棄機能を追加する必要があります。渡されたオブジェクトの定義にアクセスできません(たとえば、ファイルストリームなど)

ベースインスタンスのように動作し、ベースインスタンスから作成できる子インスタンスを作成できれば、多くの作業を節約できますが、それにはいくつかの隠された追加機能があります。これは、基本クラスの実装の詳細を知らなくても実行できますか?

次のようなコード形式で:

private class FileObjectWithDispose : FileObject, IDisposable
{//voidaction is a delegate, this is .net 2.0
    private VoidAction _disposeCallback;

public static FileObjectWithDispose wrapFile(FileObject unWrappedFile, VoidAction DisposeAction)
{//Implementation missing, this is the crux of what I don't know how to do
    FileObjectWithDispose wrappedFile = new FileObjectWithDispose(unWrappedFile);
    wrappedFile._disposeCallback = DisposeAction;
    return wrappedFile;
}

private FileObjectWithDispose()
    : base(null, null)//base class does not have a default constructor
{
    throw new NotImplementedException("FileObjectWithDispose is a wrapper class which is intended only to be cast from a filestream.");
}

private void Dispose()
{
    _disposeCallback();
    base.Dispose();
}

}

サンプル呼び出しは次のようになります。

Connect(file, username, password, domain);
return FileObjectWithDispose.wrapFile(OpenFile(path), () => { Disconnect(file, username); });

私が抱えている主な問題は、可能であれば、基本クラスがそれ自体を装飾できるインターフェイスを実装していない場合に、基本クラスのインスタンスを取得して装飾されたインスタンスを作成するにはどうすればよいですか?このタスクを実行する方法について何かアイデアはありますか?

ありがとう!

4

2 に答える 2

6

デコレータパターンが最適です。

  1. インターフェイスICustomDisposeAction(名前の例)を作成します
  2. このインターフェースを、実行したい可能性のあるすべてのクラスで実装しますDisposeAction

    FileObjectWithDispose:FileObject、IDisposable、ICustomDisposeAction

  3. も実装する別のクラスDecoratorを作成しますICustomDisposeAction。元の基本クラスをデコレータのコンストラクタに渡し、その上でデコレータを呼び出しますDisposeAction

public class Decorator : ICustomDisposeAction
{
  public FileObject wrappedFile { get; set; } 
  public Decorator(FileObject unWrappedFile,...)
  {
    wrappedFile = unWrappedFile;
    //Do your custom dispose here
  }
} 
  1. オブジェクトを破棄するカスタムの方法が必要な状況では、デコレータオブジェクトを作成し、カスタムの破棄を実行してください。

お役に立てれば。

于 2012-09-05T13:47:09.990 に答える
2

デコレータパターンを使用してみてください。このリンクが役立ちます。

于 2012-09-05T06:38:06.537 に答える