2012-01-24 15 views
1

我有一個抽象類命名爲車輛:如果覆蓋它,要求子類調用super.doSomething()?

public abstract class Vehicle { 

    public void run() { 
     addToRunningVehicleList(); 
    } 

} 

我想,每一個該extends車輛必須調用super.run()如果他們overriderun方法類。例如:

public class Car { 

    @Override 
    public void run() { // Error here because does not call super.run() 
     carRunningAnimation(); 
    } 

} 

在OOP概念或Java/C#中可能嗎?

編輯:繼佩塔爾·伊萬諾夫,我有這樣的代碼:

public abstract class Vehicle { 

    public final void run() { 
     Log.e("Run", "Add To List"); 
     runImp(); 
    } 

    public void runImp() {} 

} 

public class Car extends Vehicle { 

    @Override 
    public void runImp() { 
     Log.e("Run", "Run in Car"); 
    } 

} 

然而,它並不適合公開的API非常好。當延長車輛,最終用戶必須重寫runImp,但他們必須調用run()方法,所以我必須要公開雙方runrunImp,這使得沒有好。

+1

請記住你正在爲誰設計。如果它是一段內部代碼,評論就足夠了。如果它是一個公共API並且你希望人們繼承,那麼你需要寫一篇文檔告訴他們去做。在C#中,您可以使用虛擬和非虛擬方法來做一些鬼鬼祟祟的事情,但在Java中,如果不使用抽象基類,就很難執行此操作。 – Spence

+0

@Spence你真的瞭解我的情況。我正在編寫公共API,因此評論或文檔可能不夠。不幸的是,我找不到'虛擬'的Java等價(你應該發表你的評論作爲答案,與一些代碼段,我會選擇你的答案:) –

回答

3

這裏是我會怎麼做(C#):

public abstract class Vehicle { 

    public void Run() { 
     //code that will always run 
     addToRunningVehicleList(); 

     //code that can be overriden 
     RunImpl(); 
    } 

    protected virtual void RunImpl() { } 
} 

public class Car : Vehicle { 

    protected override void RunImpl() { 
     carRunningAnimation(); 
    } 

} 

您可以保護,以確保它不能被稱爲Vehicle子類外RunImpl

+0

有沒有辦法在Java中實現這一點?我無法在Java中找到「虛擬」等價。 –

+0

在Java中所有的方法都是虛擬的,除非你最終標記爲http://en.wikipedia.org/wiki/Final_(Java) –

+0

謝謝你的非常有趣的事實。但仍然存在問題,只是編輯了我的問題。 –

2

如果你需要需要一定的代碼,除了子類的實施運行,也許你需要把這個分成多個方法:

(C#示例)

public abstract class Vehicle 
{ 
    public void Run() 
    { 
     // Code that always runs before... 

     RunCore(); 

     // Code that always runs after... 
    } 

    protected virtual void RunCore() 
    { 
    } 
} 
1

記得是誰你正在設計。如果它是一段內部代碼,評論就足夠了。如果它是一個公共API並且你希望人們繼承,那麼你需要寫一篇文檔告訴他們去做。

在C#中,您可以使用虛擬和非虛擬方法做一些鬼鬼祟祟的東西,但在Java中,所有繼承都是虛擬的,如果不使用抽象基類,就會更難執行此操作。

使用的ABT可能會限制你提供的其他代碼進一步傳承與力調整的能力。