在虚拟方法的所有覆盖之后执行代码

时间:2011-11-05 22:49:03

标签: c# oop inheritance virtual

所以我使用基类DisplayObject设置了这个系统。 它有Render方法和其他DisplayObjects的列表,因为它是孩子。它还包含有关各种矩阵变换的数据,但我包含有关实际绘图的数据。这就是Render方法是虚拟的原因。

然后我有2个班。 ColoredShapeTexturedShape每个都继承自DisplayObject并使用以

开头的新方法覆盖Render方法
base.Render(); 

然后执行绘图代码。

我现在想要的是在父级的渲染完成之后,在所有对象的子项上调用Render。所以这是我的问题。如果我做

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

Render类的DisplayObject方法的末尾,它将在覆盖之前执行,因为它是base.Render()调用的一部分,如果我放了那个代码相反,在子类中,DisplayObject单独丢失该功能,并强制所有未来继承自它的子类手动实现该功能。

2 个答案:

答案 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()
{
}