抽象方法声明 - 虚拟?

时间:2011-03-18 10:07:07

标签: c# oop abstract-class

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

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

是否正确?

5 个答案:

答案 0 :(得分:9)

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

所以这样继承的类将不被强制来实现它,但是如果需要的话,它们就可以。

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

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

OnAddedFoo设为virtual而非abstract是有道理的。

答案 1 :(得分:5)

我想MSDN意味着您无法同时在方法上使用virtualabstract修饰符。

你可以做

public virtual void Render() {}

表示继承类可以覆盖此方法。

或者你可以做到

public abstract void Render();

表示继承类必须覆盖此方法。

答案 2 :(得分:4)

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

这可能有助于您理解它们的格式如下:

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

    }

    public virtual void Update()
    {

    }
}

答案 3 :(得分:2)

您可能会参考这句话

  

您无法使用虚拟修改器   与静态,抽象,私人或   覆盖修饰符。

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

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

答案 4 :(得分:0)

Follwing代码意味着必须在继承的类中保留此方法,并且您不能在抽象方法体中放置一些逻辑:

public abstract void Render();

但是如果你宣布虚拟方法,你可以在其中加入一些逻辑,可以 ovveride

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