2013-02-06 115 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; 
      } 

     }