如果重写了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()方法,所以我必须公开runrunImp,这没有什么更好的。

如果重写了super.doSomething(),则要求子类调用它

以下是我的操作方法(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可能会限制您提供进一步继承和强制修改其他代码的能力。