簡體   English   中英

是否要求子類調用super.doSomething()(如果重寫)?

[英]Require child classes to call super.doSomething() if overrides it?

我有一個名為Vehicle的抽象類:

public abstract class Vehicle {

    public void run() {
        addToRunningVehicleList();
    }

}

我希望extends Vehicle的每個類都必須override super.run()如果它們override run方法。 例如:

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來說不是很好。 擴展Vehicle時,最終用戶必須重寫runImp ,但隨后他們必須調用run()方法,因此我必須公開runrunImp ,這沒有什么比這更好的了。

這是我的處理方式(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();
    }

}

您可以對RunImpl保護,以確保它不能在Vehicle的子類之外被調用。

如果除了子類的實現之外還需要運行某些代碼,則可能需要將其拆分為多個方法:

(C#示例)

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

        RunCore();

        // Code that always runs after...
    }

    protected virtual void RunCore()
    {
    }
}

記住要為誰設計。 如果是內部代碼,則只需提供注釋即可。 如果它是公共API,並且您希望人們繼承,那么您需要編寫一段文檔來告訴他們這樣做。

在C#中,您可以使用虛擬方法和非虛擬方法進行一些偷偷摸摸的工作,但是在Java中,由於所有繼承都是虛擬的,因此在不使用抽象基類的情況下強制執行此操作要困難得多。

使用ABT可能會限制您提供進一步繼承和強制修改其他代碼的能力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM