2012-06-10 88 views
7

我正確的聲明一個方法abstract自動使它虛擬?抽象方法是虛擬的嗎?

也就是說,在子類中,我可以重寫它多次,並且在運行時,與該對象的運行時類型對應的方法將被調用?

是否可以聲明一個抽象的非虛方法?也就是說,這個方法必須在非抽象的子類中實現並且不能被覆蓋?

+0

可能的[C#中的每個抽象函數都是虛擬的,一般來說都是重複的嗎?](http://stackoverflow.com/questions/391557/is-every-abstract-function-virtual-in-c-in-general) –

回答

8

是的,abstract methods are virtual的定義;它們必須被重寫的實際子類可重寫:

當一個實例方法聲明包含abstract改性劑,該方法被認爲是一個抽象方法。儘管抽象方法隱含地也是虛擬方法,但它不能具有修飾符virtual

相反,你不能聲明一個抽象的非虛擬方法,因爲如果可以的話,你會有一個方法無法實現,因此永遠無法調用,使得它無用。

不過,如果你想有一個類實現一個抽象方法,但不允許任何它的子類來修改它的實現,這就是sealed進來一個例子:

abstract public class AbstractClass 
{ 
    abstract public void DoSomething(); 
} 

public class BaseClass : AbstractClass 
{ 
    public sealed override void DoSomething() 
    { 
     Console.WriteLine("Did something"); 
    } 
} 

注意的是,雖然抽象方法(隱含地)是虛擬的,具體基類中的實現是非虛擬的(因爲關鍵字sealed)。

1

是的,它們是虛擬的。否則,你將無法爲它們編寫實現。