【问题标题】:Abstract method declaration - virtual?抽象方法声明 - 虚拟?
【发布时间】:2011-07-18 01:15:08
【问题描述】:

在 MSDN 上,我发现在抽象方法声明中使用“虚拟”修饰符是错误的。 我的一位同事应该是非常有经验的开发人员,但在他的代码中使用了这个:

public abstract class BusinessObject   
{
    public virtual void Render(){}
    public virtual void Update(){}
}

它是否正确?

【问题讨论】:

    标签: c# oop abstract-class


    【解决方案1】:

    如果抽象类提供了一个可选点,继承的类可以改变行为,这可能是有意义的。

    因此,这样继承的类将不会被强制实现它,但如果需要,它们可以实现。

    这个方法通常被抽象类调用:

    public AddFoo(Foo f)
    {
       // ...
       OnAddedFoo(f);
    }
    

    这里将OnAddedFoo 设置为virtual 而不是abstract 是有意义的。

    【讨论】:

      【解决方案2】:

      我猜 MSDN 意味着你不能同时在一个方法上使用virtualabstract 修饰符。

      你可以这样做

      public virtual void Render() {}
      

      这意味着继承类可以覆盖此方法。

      或者你可以这样做

      public abstract void Render();
      

      这意味着继承类必须覆盖此方法。

      【讨论】:

        【解决方案3】:

        那些不是抽象方法,它们是空的默认方法。不同之处在于您不必覆盖它们(如果您不这样做,则不会发生任何事情)。

        查看它们的格式可能有助于您理解:

        public abstract class BusinessObject   
        {
            public virtual void Render()
            {
        
            }
        
            public virtual void Update()
            {
        
            }
        }
        

        【讨论】:

        • 哦对了,如果有body我也不能用virtual关键字,对吧?
        • @Mocco:他们确实有身体,只是空的。方法不能是virtual没有主体。
        • 如果没有实体,它们就不可能是虚拟的。如果有实体,它们就不可能是抽象的
        【解决方案4】:

        你可能参考了这句话

        你不能使用 virtual 修饰符 具有静态的、抽象的、私有的或 覆盖修饰符。

        这意味着你不能在方法声明中使用 this 一个方法不能同时是虚拟的和抽象的。

        所以你提出的用法很好,因为类是抽象的,这意味着你可以有一些抽象方法(没有必须由子类实现的实现)和虚拟方法(可以实现在子类中覆盖)。

        【讨论】:

          【解决方案5】:

          以下代码意味着您必须在继承的类中覆盖该方法,并且不能在抽象方法体中放置一些逻辑:

          public abstract void Render();
          

          但是如果你声明了虚方法,你可以在里面放一些逻辑并且可以 ovveride

          public virtual void Render()
          {
               // you can put some default logic here       
          }
          

          【讨论】:

            猜你喜欢
            • 2014-10-17
            • 1970-01-01
            • 2011-04-06
            • 2011-11-16
            • 2014-03-18
            • 2010-10-11
            • 1970-01-01
            • 2012-10-31
            • 1970-01-01
            相关资源
            最近更新 更多