У меня есть следующие классы:
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()
. Я думал о добавлении защищенного свойства с именем CachedValue в BaseClass, но я нахожу этот подход избыточным и вводящим в заблуждение других программистов, которые могут не знать о его существовании и могут напрямую вызывать ComputeValue ().
Второй вариант - использовать обнуляемый тип на уровне производного класса, поскольку мне необязательно требовать вычисления в конструкторе в BaseClass, ленивое вычисление может быть лучшим вариантом:
protected override double ComputeValue()
{
if(cachedValue.HasValue)
{
return (double) cachedValue;
}
// Do computation
cachedValue = ...
return cachedValue;
}
но я чувствую, что могу сделать лучше.
Что вы думаете об этом?
Спасибо.
Редактировать: Просто чтобы уточнить, я пытаюсь предотвратить повторный вызов ComputeValue()
, принудительно используя 'cachedValue
'.