所以我使用基类DisplayObject
设置了这个系统。
它有Render
方法和其他DisplayObjects
的列表,因为它是孩子。它还包含有关各种矩阵变换的数据,但我不包含有关实际绘图的数据。这就是Render
方法是虚拟的原因。
然后我有2个班。 ColoredShape
和TexturedShape
每个都继承自DisplayObject
并使用以
Render
方法
base.Render();
然后执行绘图代码。
我现在想要的是在父级的渲染完成之后,在所有对象的子项上调用Render
。所以这是我的问题。如果我做
foreach (var child in Children) child.Render();
在Render
类的DisplayObject
方法的末尾,它将在覆盖之前执行,因为它是base.Render()
调用的一部分,如果我放了那个代码相反,在子类中,DisplayObject
单独丢失该功能,并强制所有未来继承自它的子类手动实现该功能。
答案 0 :(得分:1)
拆分代码,使“render self”与“render children”分开:
public void Render() {
OnRender();
foreach(var child in Children) child.Render();
}
protected abstract void OnRender();
子类提供OnRender
,它提供 self ,但不提供子项。这由Render
处理。在某些情况下,将Render
设为virtual
可能很有用,这样,如果子类需要不同的子行为,可以控制它。
答案 1 :(得分:1)
你想要的是抽象方法模式。换句话说,不要让你的渲染方法虚拟crate另一个渲染调用的方法(虚拟或抽象),所以渲染将看起来像这样:
public void Render()
{
DoRender()
foreach (var child in _children)
{
child.Render();
}
}
protected virtual void DoRender()
{
}