c# - 在抽象类的构造函数中通过虚拟成员分配只读字段

标签 c# .net oop design-patterns

我知道这里已经提出了类似的问题,但我的问题具体涉及通过在抽象类的构造函数中调用虚拟成员来设置 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/

相关文章:

c# - 在 C# 中通过驱动类 B 对象访问基类 A 函数

c# - 执行多条件时出错,未知列 - Mono + NHibernate + MySQL

c# - 通过网络流发送字节,值发生变化

c# - GUI 线程中的异常导致 vshost.exe 崩溃

c# - AS/400连接方式

c# - DispatcherTimer 在控制台中不起作用

c# - 如何使用内部构造函数从具有新约束的泛型类创建实体

java - 父类(super class)和子类之间的数据所有权

Java是按值传递吗?

php - 类似于 php 中的回调委托(delegate)函数