Luke Vo
Luke Vo

Reputation: 20658

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

I have a abstract class named Vehicle:

public abstract class Vehicle {

    public void run() {
        addToRunningVehicleList();
    }

}

I want that every classes that extends Vehicle must call super.run() if they override run method. For example:

public class Car {

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

}

Is it possible in OOP concept, or Java/C#?

EDIT: Following Petar Ivanov, I have this code:

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");
    }

}

However, it's not very good for public APIs. When extending Vehicle, the end-users must override runImp, but then they have to call run() method, so I have to make public both run and runImp, which make nothing better.

Upvotes: 1

Views: 494

Answers (3)

Petar Ivanov
Petar Ivanov

Reputation: 93020

Here is how I would do it (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();
    }

}

You can make the RunImpl protected to make sure it can't be called outside the subclasses of Vehicle.

Upvotes: 3

Spence
Spence

Reputation: 29322

Remember who you are designing for. If it's an internal piece of code a comment will suffice. If it's a public API and you want people to inherit then you need to write a piece of documentation telling them to do it.

In C# you can do some sneaky stuff with virtual and non-virtual methods but in Java as all inheritence is virtual it's a lot harder to enforce this without using an abstract base class.

Using an ABT may limit your ability to provide further inheritence and force modification of other code.

Upvotes: 1

Lance U. Matthews
Lance U. Matthews

Reputation: 16596

If you need to require certain code to run in addition to the child class' implementation, perhaps you need to split this into multiple methods:

(C# example)

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

        RunCore();

        // Code that always runs after...
    }

    protected virtual void RunCore()
    {
    }
}

Upvotes: 2

Related Questions