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