我有以下课程:

public abstract class BaseClass
{
    private readonly double cachedValue;

    public BaseClass()
    {
         cachedValue = ComputeValue();
    }

    protected abstract double ComputeValue()
}


public class ClassA : BaseClass
{
    protected override double ComputeValue()  { ... }
}

public class ClassB : BaseClass
{
    protected override double ComputeValue()  { ... }
}


其中ComputeValue()是耗时的计算。

问题是ClassAClassB中还有其他方法需要从ComputeValue()返回的值。我当时正在考虑在BaseClass中添加一个名为“ CachedValue”的受保护属性,但是我发现这种方法是多余的,并且对其他可能不知道其存在并可能直接调用ComputeValue()的程序员造成了困扰。

第二种选择是在派生类级别使用可为空的类型,因为我不一定需要在BaseClass的构造函数中完成计算,惰性计算可能是一个更好的选择:

protected override double ComputeValue()
{
    if(cachedValue.HasValue)
    {
        return (double) cachedValue;
    }

    // Do computation
    cachedValue = ...

    return cachedValue;
}


但我觉得我可以做得更好。

您对此有何看法?

谢谢。

编辑:只是为了澄清,我试图通过强制使用'ComputeValue()'来防止多次调用cachedValue

最佳答案

另一种方法是在GetValue上添加公共接口方法Baseclass,并且只允许覆盖继承类的ComputeValue方法-这样,您仍然可以扩展功能,但可以控制控件的行为/上下文。基类中ComputeValue的结果,即,您可以像示例中那样添加备注,或根据需要装饰/扩展。

Non-Virtual interface (NVI) pattern之后。

    public abstract class BaseClass
    {
        private double? cachedValue;

        public BaseClass()
        {
        }

        protected abstract double ComputeValue();

        public virtual double GetValue()
        {
            if (cachedValue.HasValue)
            {
                return (double)cachedValue;
            }
            else
            {
                cachedValue = ComputeValue();
                return (double)cachedValue;
            }

        }
    }

09-10 04:29