虚拟和抽象方法之间的区别

以下是来自MSDN的一些代码:

// compile with: /target:library public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } } 

任何人都可以解释关于抽象和虚拟方法之间的差异上面的代码?

虚拟方法有一个实现,并为派生类提供覆盖它的选项。 抽象方法不提供实现并强制派生类重写该方法。

所以抽象方法中没有实际的代码,子类必须覆盖方法。 虚拟方法可以有代码,通常是默认实现的东西,任何子类都可以使用override修饰符覆盖方法,并提供自定义实现。

 public abstract class E { public abstract void AbstractMethod(int i); public virtual void VirtualMethod(int i) { // Default implementation which can be overridden by subclasses. } } public class D : E { public override void AbstractMethod(int i) { // You HAVE to override this method } public override void VirtualMethod(int i) { // You are allowed to override this method. } } 

首先你应该知道虚拟和抽象方法之间的区别。

抽象方法

  • 抽象方法驻留在抽象类中,没有主体。
  • 抽象方法必须在非抽象子类中重写。

虚拟方法

  • 虚拟方法可以驻留在抽象类和非抽象类中。
  • 没有必要重写派生的虚拟方法,但它可以。
  • 虚拟方法必须具有正文….可以通过“覆盖关键字”覆盖…..

一个抽象的方法必须是派生类中的调用重写,否则它会给编译时错误,在虚拟中你可能会或可能不会重写它的取决于它是否足够好用它

例:

 abstract class twodshape { public abstract void area(); // no body in base class } class twodshape2 : twodshape { public virtual double area() { Console.WriteLine("AREA() may be or may not be override"); } } 

抽象方法:

  • 如果在一个类中定义了一个抽象方法,那么该类应该声明为一个抽象类。

  • 抽象方法应该只包含方法定义,不应该包含方法体/实现。

  • 一个抽象的方法必须超越派生类。

虚拟方法:

  • 虚拟方法可以在派生类中进行,但不是强制性的。
  • 虚拟方法必须具有方法主体/实现以及定义。

例:

 public abstract class baseclass { public abstract decimal getarea(decimal Radius); public virtual decimal interestpermonth(decimal amount) { return amount*12/100; } public virtual decimal totalamount(decimal Amount,decimal principleAmount) { return Amount + principleAmount; } } public class derivedclass:baseclass { public override decimal getarea(decimal Radius) { return 2 * (22 / 7) * Radius; } public override decimal interestpermonth(decimal amount) { return amount * 14 / 100; } }