假设您有某种工厂创建的资源在构建后仍属于工厂,如下所示:
public class Resource : IDisposable {
public void Dispose() { /* ... */ }
}
public class ResourceManager : IDisposable {
public Resource Load() { /* create resource and add to list */ }
public void Dispose() { /* dispose all loaded resources in list */ }
}
现在你有一个基类,它需要Resource
在其构造函数中初始化一个实例:
public class Fooificator {
public Fooificator(Resource resource) {
this.resource = resource;
}
private Resource resource;
}
从这样的基类派生的类如何在Resource
不丢失对工厂的引用的情况下构造 a ?
使用静态方法的天真方法无法记住工厂(除了丑陋的黑客攻击,例如将其存储在静态字段中以便构造函数在基类构造完成后拾取,或者使用两阶段Resource
初始化通过构造函数调用的Initialize()
方法提供给基类)
public class DefaultFooificator : Fooificator {
public DefaultFooificator() : base(loadDefaultResource()) {}
private static Resource loadDefaultResource() {
ResourceManager resourceManager = new ResourceManager();
return resourceManager.Load();
// Bad: losing reference to ResourceManager here!
}
}
一种可能的解决方法是命名构造函数习语:
public class DefaultFooificator : Fooificator, IDisposable {
public static DefaultFooificator Create() {
ResourceManager resourceManager = new ResourceManager();
DefaultFooificator fooificator = new DefaultFooificator(
resourceManager.Load()
);
fooificator.resourceManager = resourceManager;
return fooificator;
}
private DefaultFooificator(Resource resource) : base(resource) {}
private ResourceManager resourceManager;
}
但是,在解决存储ResourceManager
引用的问题时,这将不允许进一步的类从DefaultFooificator
.
是否有任何优雅的解决方案可以让我进一步从参考中派生DefaultFooificator
或以ResourceManager
其他方式存储参考?