Давайте предположим, что наша система может выполнять действия, и что действие требует некоторых параметров для своей работы.
Для всех действий я определил следующий базовый класс (упрощенный для вашего удовольствия от чтения):
public abstract class BaseBusinessAction<TActionParameters>
: where TActionParameters : IActionParameters
{
protected BaseBusinessAction(TActionParameters actionParameters)
{
if (actionParameters == null)
throw new ArgumentNullException("actionParameters");
this.Parameters = actionParameters;
if (!ParametersAreValid())
throw new ArgumentException("Valid parameters must be supplied", "actionParameters");
}
protected TActionParameters Parameters { get; private set; }
protected abstract bool ParametersAreValid();
public void CommonMethod() { ... }
}
Только конкретная реализация BaseBusinessAction
знает, как проверить, что переданные ей параметры действительны, и поэтому
ParametersAreValid
- абстрактная функция. Однако я хочу, чтобы конструктор базового класса обеспечивал, чтобы передаваемые параметры всегда были действительными, поэтому я добавил
вызов ParametersAreValid
для конструктора, и я выбрасываю исключение, когда функция возвращает false
. Пока все хорошо, правда? Ну нет.
Анализ кода говорит мне " не вызывать переопределенные методы в конструкторах ", что на самом деле имеет большой смысл, потому что когда вызывается конструктор базового класса
конструктор дочернего класса еще не был вызван, и поэтому метод ParametersAreValid
может не иметь доступа к некоторой критической переменной-члену, которую
конструктор дочернего класса будет установлен.
Итак, вопрос такой: как мне улучшить этот дизайн?
Добавлять ли параметр Func<bool, TActionParameters>
в конструктор базового класса? Если бы я сделал:
public class MyAction<MyParameters>
{
public MyAction(MyParameters actionParameters, bool something) : base(actionParameters, ValidateIt)
{
this.something = something;
}
private bool something;
public static bool ValidateIt()
{
return something;
}
}
Это сработает, потому что ValidateIt
статично, но я не знаю ... Есть ли лучший способ?
Комментарии приветствуются.