在MSDN上,我发现在抽象方法声明中使用“virtual”修饰符是错误的。 我的一位同事应该是非常有经验的开发人员,但在他的代码中使用了这个:
public abstract class BusinessObject
{
public virtual void Render(){}
public virtual void Update(){}
}
是否正确?
答案 0 :(得分:9)
如果抽象类提供了一个可选点,继承的类可以改变行为,这是有意义的。
所以这样继承的类将不被强制来实现它,但是如果需要的话,它们就可以。
通常这个方法由抽象类调用:
public AddFoo(Foo f)
{
// ...
OnAddedFoo(f);
}
将OnAddedFoo
设为virtual
而非abstract
是有道理的。
答案 1 :(得分:5)
我想MSDN意味着您无法同时在方法上使用virtual
和abstract
修饰符。
你可以做
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
}