我知道这里已经提出了类似的问题,但我的问题具体涉及通过在抽象类的构造函数中调用虚拟成员来设置 readonly
字段的场景。
考虑以下抽象类:
public abstract class FooBase
{
private readonly IDictionary<string,object> _readonlyCache;
protected abstract IDictionary<string,object> SetCache();
protected FooBase()
{
_readonlyCache = SetCache();
}
}
问题:
1) 这是彻头彻尾的糟糕设计吗?
2)有没有更好的设计?
我知道您可以将 FooBase
的实现者声明为 sealed
,这将确保只有 SetCache()
的正确实现叫做。我不喜欢的是没有办法强制必须将实现者标记为sealed
。非常欢迎任何建议。
最佳答案
如果可能的话,这绝对是要避免的事情——在构造函数中调用虚拟方法总是有点臭,因为你将在子类执行初始化之前执行代码——它的构造函数主体不会执行。无论子类是否密封都是如此;你的处境很糟糕。
您可能需要考虑让子类构造函数将缓存传递给构造函数:
public abstract class FooBase
{
private readonly IDictionary<string,object> _readonlyCache;
protected FooBase(IDictionary<string,object> cache)
{
_readonlyCache = cache;
}
}
这样,直接子类就可以决定要做什么 - 它可能是抽象的,例如从进一步派生的类中获取缓存,或者它可能构建自己的缓存。
关于c# - 在抽象类的构造函数中通过虚拟成员分配只读字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18985525/