Удостоверьтесь, что базовый метод называют в C#

Я могу так или иначе вынудить производный класс всегда назвать основу переопределенных методов?

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 (). Это просто не чувствует себя очень аккуратным, нет ли никакой лучший путь?

Я надеюсь, что Вы получаете вопрос, и я сожалею о любых плохих англичанах.

22
задан Matteus Hemström 31 May 2010 в 17:45
поделиться

3 ответа

Используйте шаблон метода шаблона - не переопределяйте базовый метод, который должен выполнять некоторую работу, переопределите один конкретный бит, который может быть абстрактным или не- op в базовом классе. (Решение о том, делать ли это бесполезным или абстрактным, обычно довольно очевидно - имеет ли базовый класс смысл сам по себе, как конкретный класс?)

Похоже, это в основном шаблон, который вы нашли с UpdateEx - хотя обычно это UpdateImpl или что-то подобное, по моему опыту. На мой взгляд, нет ничего плохого в этом как шаблоне - он позволяет избежать идеи принуждения всех производных классов писать один и тот же код для вызова базового метода.

31
ответ дан 29 November 2019 в 04:54
поделиться

Я думаю, что предложение, которое вы нашли, хорошо.

Единственный метод базового класса, который нельзя избежать вызова из подкласса в конструкторе базового класса.

2
ответ дан 29 November 2019 в 04:54
поделиться

Я думаю, что наличие невиртуального базового члена, вызывающего виртуальную «ловушку», которая может быть расширена, является наиболее распространенным решением для такого рода проблем.

В зависимости от вашего варианта использования вместо этого вы можете использовать событие , но обычно для реализации события используется виртуальный метод OnEvent , который подклассы могут переопределить. добавления обработчика событий, поэтому в вашем примере это сводится к одному и тому же.

2
ответ дан 29 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: