2013-02-06 112 views
57

这里的区别是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. 
    } 
} 

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

+0

什么是你的具体问题,有什么不明白吗? –

+0

你从http://msdn.microsoft.com/en-us/library/ms173150(v=vs.80).aspx – andy

+0

@DanielHilgarth复制的每一件事都更新了我的问题。请看看。 – iJade

回答

150

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

所以,抽象方法中没有实际的代码,子类必须覆盖该方法。虚拟方法可以具有代码,通常是默认实现的东西,并且任何子类CAN都可以使用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. 
    } 
} 
+4

优秀放!一个问题虽然...你是否必须明确声明子类中的抽象方法的'override'[因为它需要被覆盖]? –

+7

对于抽象方法,你必须明确说明它,是的。对于虚拟方法来说更复杂。如果您没有在那里声明'override'关键字,原始方法将会隐藏。如果这是您的意图,您可以使用'new'关键字来摆脱警告,但是您想隐藏方法的情况非常罕见。所以除非你特别想使用方法隐藏,否则你应该总是使用'override'关键字 – Dennisch

35

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

抽象方法

  • 抽象方法存在于抽象类,它有没有身体。
  • 抽象方法必须在非抽象子类中重写。

虚拟方法

  • 虚拟方法可以驻留在抽象和非抽象类。
  • 没有必要重写派生的虚拟方法,但它可以。
  • 虚拟方法必须有身体....可以通过“override关键字”覆盖.....
+0

*抽象方法必须在非抽象子类中重写。*不是那样,你可以在抽象类中重写它。 –

3

抽象方法必须在派生类中其他明智的,它会给编译时错误调用覆盖 和虚拟您可能会或可能不会覆盖,如果它不够好使用它取决于它

例子:

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"); 
    } 
} 
2

抽象方法:

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

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

  • 抽象方法必须在派生类中进行。

虚拟方法:

  • 虚拟方法可以超过在派生类兜风,但不是强制性 。
  • 虚拟方法必须具有沿着定义的 的方法主体/实现。

例子:

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; 
      } 

     }