Рассмотрите эту часть кода:
public abstract class Validator
{
protected Validator()
{
}
protected abstract void ValidateCore(object instance, string value, IList<ValidationResult> results);
public void Validate(object instance, string value, IList<ValidationResult> results)
{
if (null == instance) throw new ArgumentNullException("instance");
if (null == results) throw new ArgumentNullException("results");
ValidateCore(instance, value, results);
}
}
Посмотрите на Validate()
перегрузка, как абстрактный класс может иметь определения как это?
В абстрактном классе должен быть хотя бы один абстрактный метод. Это не значит, что он не может определять конкретные методы. Одно из применений этого свойства - шаблон проектирования Template Method, который позволяет вам определять алгоритм таким образом, чтобы он мог быть изменен подклассами.
Думаю, это совершенно нормально. Это называется шаблоном шаблонного метода. Верно?