Я могу так или иначе вынудить производный класс всегда назвать основу переопределенных методов?
public class BaseClass
{
public virtual void Update()
{
if(condition)
{
throw new Exception("..."); // Prevent derived method to be called
}
}
}
И затем в производном классе:
public override void Update()
{
base.Update(); // Forced call
// Do any work
}
Я искал и нашел, что предложение использует невиртуальное Обновление (), но также и защищенный виртуальный UpdateEx (). Это просто не чувствует себя очень аккуратным, нет ли никакой лучший путь?
Я надеюсь, что Вы получаете вопрос, и я сожалею о любых плохих англичанах.
Используйте шаблон метода шаблона - не переопределяйте базовый метод, который должен выполнять некоторую работу, переопределите один конкретный бит, который может быть абстрактным или не- op в базовом классе. (Решение о том, делать ли это бесполезным или абстрактным, обычно довольно очевидно - имеет ли базовый класс смысл сам по себе, как конкретный класс?)
Похоже, это в основном шаблон, который вы нашли с UpdateEx
- хотя обычно это UpdateImpl
или что-то подобное, по моему опыту. На мой взгляд, нет ничего плохого в этом как шаблоне - он позволяет избежать идеи принуждения всех производных классов писать один и тот же код для вызова базового метода.
Я думаю, что предложение, которое вы нашли, хорошо.
Единственный метод базового класса, который нельзя избежать вызова из подкласса в конструкторе базового класса.
Я думаю, что наличие невиртуального базового члена, вызывающего виртуальную «ловушку», которая может быть расширена, является наиболее распространенным решением для такого рода проблем.
В зависимости от вашего варианта использования вместо этого вы можете использовать событие
, но обычно для реализации события используется виртуальный метод OnEvent
, который подклассы могут переопределить. добавления обработчика событий, поэтому в вашем примере это сводится к одному и тому же.