【问题标题】:C# virtual methods questionC#虚拟方法问题
【发布时间】:2010-07-07 08:13:41
【问题描述】:

有一点我不太明白:调用虚方法的时候,也调用了基方法?

因为当我使用公共覆盖 WinForm OnPaint 方法时,在其主体中调用 base.OnPaint(e)。我不明白,我认为虚拟方法会覆盖原始方法。 如果通常不调用它,为什么在这种情况下调用它?谢谢

【问题讨论】:

标签: c# virtual-functions


【解决方案1】:

不,如果您不从派生类中显式调用它,则不会调用它。

【讨论】:

    【解决方案2】:

    当调用虚方法时, base 方法也被调用了?

    没有。

    因为当我使用公共覆盖 OnPaint(),在它的主体 base.OnPaint(e) 叫做。我不明白,我 认为虚方法会覆盖 原版。

    开发人员选择调用 base.OnPaint(e) 并做其他事情。换句话说,基本实现是你手头的东西,以防它对你有用 - 你可以调用它,然后做一些额外的具体工作。

    如果函数体只是对基类的调用,则相当于根本不编写覆盖函数。

    【讨论】:

    • 嗯..它的标准 WinForm OnPaint 方法。是否因为基础包含一些实际绘制的低级图形例程而被调用?
    • @Snake:您的评论非常具体到一个功能的实现。我不知道为什么总是调用 base,但我可以猜到总有一些共同点需要做。
    • 对于 OnPaint 方法,您的代码很可能在默认图形表示的“顶部”绘制了一些东西。这就是为什么可以调用 OnPaint 的基本实现:绘制背景等。
    【解决方案3】:

    我明白,当您说“调用虚拟方法”时,您的意思是覆盖方法。

    答案是否定的。每当调用任何版本的虚拟方法时,它都不会自动调用其基类方法。但有时您想调用它们,因此您包括对基类方法的显式调用。像这样的:

    class Base
    {
      public virtual void VirtualMethod()
      {
        // Insert code here
      }
    }
    
    class Derived : Base
    {
      public override void VirtualMethod()
      {
        // Insert code here
        base.VirtualMethod(); // Explicit call to the base class method
      }
    }
    

    如果我们没有包含指令base.VirtualMethod();,则在调用派生类方法时不会调用基类方法。

    【讨论】:

      【解决方案4】:

      当调用虚方法时, base 方法也被调用了?

      这取决于你是否在被覆盖的方法中调用base.XXX

      【讨论】:

        【解决方案5】:

        有时,无论正在执行哪个子方法,“基”方法中都有有用的代码,然后子级可以只调用基方法,但这是可选的。

        除非您专门调用基方法,否则将调用子方法而不是基方法而不是“以及”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-30
          • 2011-02-16
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          • 2015-09-09
          • 2010-10-11
          • 1970-01-01
          相关资源
          最近更新 更多