我有以下课程:
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()
是耗时的计算。问题是
ClassA
和ClassB
中还有其他方法需要从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;
}
}
}