2011-03-18 90 views
10

在MSDN上,我發現在抽象方法聲明中使用「虛擬」修飾符是錯誤的。 我的一個同事,誰應該相當經驗的開發者,儘管這個應用在他的代碼:抽象方法聲明 - 虛擬?

public abstract class BusinessObject 
{ 
    public virtual void Render(){} 
    public virtual void Update(){} 
} 

而且它正確與否?

回答

4

那些不是抽象方法,它們是空的默認方法。不同的是,你不必重寫它們(如果你不這樣做,什麼都不會發生)。

它可以幫助您的理解,看到他們喜歡的格式:

public abstract class BusinessObject 
{ 
    public virtual void Render() 
    { 

    } 

    public virtual void Update() 
    { 

    } 
} 
+0

哦對了,如果他們也有一個身體,對的,我不能使用虛擬的關鍵字? – Mocco 2011-03-18 10:10:14

+0

@Mocco:他們*有*有一個身體,它只是空的。方法不能是'虛擬'*而沒有*主體。 – 2011-03-18 10:18:44

+0

如果沒有身體,他們不能是虛擬的。如果有一個身體,他們不能抽象 – 2011-03-18 10:27:11

9

它可以使有道理的,如果抽象類提供可選地步繼承類可以改變的行爲。

所以這種方式繼承的類將不會被迫來實現它,但他們可以,如果他們需要。

通常這個方法是由抽象類叫做:

public AddFoo(Foo f) 
{ 
    // ... 
    OnAddedFoo(f); 
} 

這很有意義的OnAddedFoovirtual而不是abstract

5

我猜MSDN意味着你不能同時在方法上使用virtualabstract修改器。

您可以做

public virtual void Render() {} 

這意味着繼承類可以重寫此方法。

或者你也可以做

public abstract void Render(); 

這意味着繼承類必須重寫此方法。

2

你可能指的這句話

不能使用virtual修飾符 與靜態,抽象的,私人或 覆蓋改性劑。

這意味着你不能在方法聲明中使用這個方法不能同時是虛擬的和抽象的。

所以你提出的用法很好,因爲這個類是抽象的,這意味着你可以在那裏有一些抽象方法(沒有必須由子類實現的實現)和虛方法在子類中重寫)。

0

Follwing代碼意味着你必須 ovveride在繼承的類此方法,你不能把一些邏輯的抽象方法體:

public abstract void Render(); 

但是如果你聲明的虛擬方法,你可以把一些內部邏輯它和可以 ovveride

public virtual void Render() 
{ 
    // you can put some default logic here  
}