Выполнение кода после всех переопределений виртуального метода - PullRequest
2 голосов
/ 06 ноября 2011

Итак, я настроил эту систему с базовым классом DisplayObject. У него есть метод Render и список других DisplayObjects как его детей. Он также содержит данные о различных матричных преобразованиях, но I не содержит данные о реальном чертеже. Вот почему метод Render является виртуальным.

У меня тогда есть 2 класса. ColoredShape и TexturedShape каждый наследует от DisplayObject и переопределяет метод Render новым методом, начинающимся с

base.Render(); 

и затем выполняем код рисования.

Теперь я хочу вызвать Render для всех потомков объекта после Рендеринг на родительском объекте завершен. Так что есть моя проблема. Если я сделаю

foreach (var child in Children) child.Render();

в конце метода Render в классе DisplayObject он будет выполнен до переопределения, так как это часть вызова base.Render(), и если я вместо этого помещу этот код в подклассы, DisplayObject сам по себе теряет эту функциональность и заставляет все будущие подклассы, наследуемые от него, реализовывать эту функцию вручную.

Ответы [ 2 ]

1 голос
/ 06 ноября 2011

То, что вы хотите, это шаблон абстрактного метода.Другими словами, не делайте ваш метод рендеринга виртуальным, создайте другой метод (виртуальный или абстрактный), который выполняет вызовы. Поэтому рендер будет выглядеть примерно так:

public void Render()
{
    DoRender()

    foreach (var child in _children)
    {
        child.Render();
    }
}

protected virtual void DoRender()
{
}
1 голос
/ 06 ноября 2011

Разделите код так, чтобы «render self» было отделено от «render children»:

public void Render() {
    OnRender();
    foreach(var child in Children) child.Render();
}
protected abstract void OnRender();

Подклассы предоставляют OnRender, что делает self , но не дочерние,Это обрабатывается Render.В некоторых случаях может быть полезно сделать Render как virtual, чтобы подклассы могли контролировать это, если им нужно другое поведение ребенка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...