我正在修改位于两个已建立图层之间的一些代码,并且无法确定最佳设计是什么。
目前,代码调用文件访问库,并将对象返回给调用者。我需要扩展返回的对象以添加一些自定义配置功能。我无权访问传递的对象的定义(例如,有些是文件流)
如果我可以创建一个行为类似于基本实例的子实例,并且可以从基本实例创建,但它有一些隐藏的额外功能,这将为我节省很多工作。这可以在不知道基类的实现细节的情况下完成吗?
代码形式看起来很像这样:
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); });
我遇到的主要困难是,如果可能的话,如果基类没有实现允许自己装饰的接口,我如何获取基类实例并创建一个装饰实例? 任何想法如何完成这项任务?
谢谢!
答案 0 :(得分:4)
装饰者模式是要走的路。
ICustomDisposeAction
(示例名称)使用您想要执行DisposeAction
的所有可能类来实现此接口。
FileObjectWithDispose:FileObject,IDisposable,ICustomDisposeAction
创建另一个类Decorator,它也实现了ICustomDisposeAction
。通过装饰器的构造函数传递原始基类,然后在其上调用装饰器的DisposeAction
。
public class Decorator : ICustomDisposeAction { public FileObject wrappedFile { get; set; } public Decorator(FileObject unWrappedFile,...) { wrappedFile = unWrappedFile; //Do your custom dispose here } }
希望这有帮助。
答案 1 :(得分:2)
尝试使用Decorator模式。 This链接可以提供帮助。