Ваш подход по сути правильный путь ...
Редактировать:
Ваша "спецификация":
- Поведение по умолчанию
- Обязательное переопределение
Теперь, поскольку вы, похоже, хотите, чтобы «поведение по умолчанию» всегда выполнялось, вам нужно
public string ToString()
{
// placeholder for some default behaviour
string result = doToString();
// placeholder for some more default behaviour
return result;
}
protected abstract string doToString();
Это работает, только если вы знаете, что делает базовый класс в целом, и хотите предоставить реализацию для doToString()
в производном классе. Это известно как шаблонный метод шаблон проектирования.
Однако, если вы ищете способ требовать от разработчика производного класса для вызова base.ToString()
в его реализации ToString()
, то сделать это невозможно. Разрешая переопределение, вы даете производному классу контроль над его реализацией.
Вы можете задокументировать свою рекомендацию всегда звонить base.ToString()
, но это все.
Использование интерфейса определяет публичный контракт для вашего класса. Это не дает вам никакого дополнительного преимущества по сравнению с шаблоном Template Method, так как вам все еще нужно извлечь из базового класса, чтобы получить реализацию по умолчанию.
Есть ли у вас какие-либо подробности о том, что вы пытаетесь предоставить в своем базовом классе как "поведение по умолчанию"? Может быть, это поможет прийти к лучшему решению. Глядя на упомянутый вопрос, это по сути тот же подход.