如果重写了super.doSomething(),则要求子类调用它
本文关键字:求子 子类 调用 重写 super doSomething 如果 | 更新日期: 2023-09-27 18:21:09
我有一个名为Vehicle的抽象类:
public abstract class Vehicle {
public void run() {
addToRunningVehicleList();
}
}
我希望extends
车辆必须调用super.run()
的每个类,如果它们是override
run
方法。例如:
public class Car {
@Override
public void run() { // Error here because does not call super.run()
carRunningAnimation();
}
}
这在OOP概念或Java/C#中可能吗?
编辑:跟随Petar Ivanov,我有这个代码:
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可能会限制您提供进一步继承和强制修改其他代码的能力。