[英]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()
方法,因此我必須公開run
和runImp
,這沒有什么比這更好的了。
這是我的處理方式(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.