我是在抽象類中尋找一些代碼:虛擬方法,而身體
public virtual void CountX(){}
public virtual void DoCalculation() { ...code}
我爲什麼要在一個抽象類中聲明一個空的虛方法,如果它不是強制性的覆蓋它派生類型?
我是在抽象類中尋找一些代碼:虛擬方法,而身體
public virtual void CountX(){}
public virtual void DoCalculation() { ...code}
我爲什麼要在一個抽象類中聲明一個空的虛方法,如果它不是強制性的覆蓋它派生類型?
正如@Adam告訴你的,在很多情況下,它是有道理的。當你創建一個抽象類時,這是因爲你想爲所有派生的類創建一個通用接口;但是,在這種繼承級別下,您將沒有足夠的信息來爲該方法創建工作代碼。
例如,如果你創建類圖,與的getArea()方法,你將不能夠編寫是要正確計算該地區所有的數字代碼。您必須等待編寫代碼矩形或圈(均源自圖),以便能夠爲其編寫工作代碼。
因爲如果默認行爲是什麼都不做,但派生類可能想做點什麼。這是一個非常有效的結構。
它允許您的基本代碼來調用它。當有「BeforeXXX」和「AfterXXX」代碼時,你傾向於看到類似的設計,在基類中這個代碼是空的,但該方法需要在那裏編譯。在派生類中,此代碼是可選的,但需要虛擬才能被覆蓋。
它在抽象類中的事實不應該混淆它的行爲。
一個例子:
abstract class Base
{
public void ProcessMessages(IMessage[] messages)
{
PreProcess(messages);
// Process.
PostProcess(messages);
}
public virtual void PreProcess(IMessage[] messages)
{
// Base class does nothing.
}
public virtual void PostProcess(IMessage[] messages)
{
// Base class does nothing.
}
}
class Derived : Base
{
public override void PostProcess(IMessage[] messages)
{
// Do something, log or whatever.
}
// Don't want to bother with pre-process.
}
如果這些方法(前,後)是抽象的,那麼所有的派生類將需要實現它們(可能爲空的方法) - 可使用移除代碼垃圾在基地空的虛擬方法。
當您將方法聲明爲抽象方法時,繼承的類具有以覆蓋該方法(提供實現)。這是強制性的。
當方法聲明爲虛擬時,繼承者可以用覆蓋該方法並提供一個不是默認的實現。
如果是強制重寫並且沒有默認邏輯可以寫入基類,那麼虛擬性是錯誤的,並且方法應該是抽象的。如果默認行動是什麼都不做,就像亞當所說的那樣,在基類中做空虛擬方法是完全有效的結構
從設計角度看,這味道不好,表明設計的實現處於不成熟的狀態。如果每個派生特定基類的類都不需要方法,那麼根據定義它不屬於基類。您通常會發現,此方法由基類的特定派生使用,並且在您的繼承層次結構中指示新的接口或抽象層。
virutal。是的:) – Heliac 2013-08-20 19:06:05