2008-09-17 39 views

回答

10

抽象方法或屬性(都可以是虛擬的或抽象的)只能在抽象類中聲明,並且不能有正文,即不能在抽象類中實現它。

虛擬方法或屬性必須有一個主體,即您必須提供一個實現(即使主體爲空)。

如果有人想使用你的抽象類,他將不得不實現一個繼承它的類,並顯式實現抽象方法和屬性,但可以選擇不覆蓋虛方法和屬性。

例:

using System; 
using C=System.Console; 

namespace Foo 
{ 
    public class Bar 
    { 
     public static void Main(string[] args) 
     { 
      myImplementationOfTest miot = new myImplementationOfTest(); 
      miot.myVirtualMethod(); 
      miot.myOtherVirtualMethod(); 
      miot.myProperty = 42; 
      miot.myAbstractMethod(); 
     } 
    } 

    public abstract class test 
    { 
     public abstract int myProperty 
     { 
      get; 
      set; 
     } 

     public abstract void myAbstractMethod(); 

     public virtual void myVirtualMethod() 
     { 
      C.WriteLine("foo"); 
     } 

     public virtual void myOtherVirtualMethod() 
     { 
     } 
    } 

    public class myImplementationOfTest : test 
    { 
     private int _foo; 
     public override int myProperty 
     { 
      get { return _foo; } 
      set { _foo = value; } 
     } 

     public override void myAbstractMethod() 
     { 
      C.WriteLine(myProperty); 
     } 

     public override void myOtherVirtualMethod() 
     { 
      C.WriteLine("bar"); 
     } 
    } 
} 
0

如果你想在你的基類中給它一個實現,你可以使它成爲虛擬的,如果你不把它抽象化。

是的,只有方法可以聲明爲虛方法。

3

如果您不想在基類中定義任何實現並且想強制它在任何派生類中定義,那麼您會使用抽象。如果要提供可由派生類重寫的默認實現,請將其定義爲虛擬。

是的,只有方法可以是虛擬的。

0

摘要表示您無法提供默認實現。這又意味着所有的子類都必須提供抽象方法的實現,以便實例化(具體)。

我不確定'限制'是什麼意思,所以不能回答這個問題。

屬性可以被聲明爲虛擬的,但是你可以在概念上將它們視爲方法。

2

如果存在基本實現,則應該聲明一個虛擬成員,但是在子類中可能會覆蓋該功能。虛擬也可以用來代替抽象以允許方法實現是可選的(即,基本實現是空的方法)

當將成員設置爲虛擬,但虛擬成員比非虛擬成員慢時沒有限制,虛擬方法。

這兩種方法和屬性都可以標記爲虛擬。

0

首先,我會回答你第二個問題。只有方法可以被聲明爲虛擬的。 當你希望在你的基類中有一些默認的功能時,你會選擇虛擬而不是抽象的,但是你希望保留通過繼承你的基類的類來覆蓋這個功能的選項。 爲例子:

如果要實現的形狀類,你可能有一個名爲的getArea()返回你的形狀的面積法。在這種情況下,Shape類中的getArea()方法沒有默認行爲,因此您可以將其實現爲abstract。將方法實現爲抽象將會阻止您實例化對象的形狀對象。

在另一方面,如果實現了類,你可能要實現在這種情況下,方法樹皮(),你可能想實現一個默認的吠叫聲,並把它在類,而一些繼承類,如類Chiwawa可能想重寫此方法並實現特定的吠叫聲。在這種情況下,方法樹皮將被實現爲虛擬,您將能夠實例化狗以及Chiwawas。

1

有一個疑難雜症在這裏要注意的Windows窗體。

如果你想要一個可以繼承的Control/UserControl,即使你在基類中沒有邏輯,你也不希望它是抽象的,否則你將無法使用Designer中的派生類: http://www.urbanpotato.net/default.aspx/document/2001

0

我個人將大多數方法和屬性標記爲虛擬。我使用代理和延遲加載很多,所以我不想擔心以後改變的東西。

相關問題