【问题标题】:Executing code after all the overrides of a virtual method在虚拟方法的所有覆盖之后执行代码
【发布时间】:2011-12-22 20:35:35
【问题描述】:

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

然后我有 2 节课。 ColoredShapeTexturedShape 都继承自 DisplayObject 并使用以

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

然后做绘图代码。

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

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

DisplayObject 类中的Render 方法的末尾,它将在覆盖之前执行,因为它是base.Render() 调用的一部分,如果我将该代码放在子类中,则仅DisplayObject 就失去了该功能,它会强制从它继承的所有未来子类手动实现该功能。

【问题讨论】:

    标签: c# oop inheritance virtual


    【解决方案1】:

    你想要的是抽象方法模式。换句话说,不要让你的渲染方法 virtual crate 另一个渲染调用的方法(虚拟或抽象),所以渲染看起来像这样:

    public void Render()
    {
        DoRender()
    
        foreach (var child in _children)
        {
            child.Render();
        }
    }
    
    protected virtual void DoRender()
    {
    }
    

    【讨论】:

      【解决方案2】:

      拆分代码,使“render self”与“render children”分开:

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

      子类提供OnRender,它呈现self,而不是子类。这是由Render 处理的。在某些情况下,将Render 设置为virtual 可能很有用,这样子类可以在需要不同子行为时进行控制。

      【讨论】:

        猜你喜欢
        • 2018-03-06
        • 2014-01-05
        • 2012-06-19
        • 2012-10-26
        • 1970-01-01
        • 2011-05-21
        • 2011-01-28
        • 2020-08-31
        • 2014-03-18
        相关资源
        最近更新 更多