i'm beginner and just learning abstract classes and interfaces but really struggeling to get it right.
MY Class structure.
- Abstract Class Vehicle
- Class Car (extends Vehicle, implements ITuning)
- Class Motorcycle (extending Vehicle)
- Interface ITuning
I want to have an abstract method doRace() that I can use in my Car class to compare the Car Objects (car.getHp()) and prints the winner. I try to implement a doRace(object o) into the Interface ITuning and a doRace(Car o) into my Car class but get the error. How can I implement that correctly ?
The type Car must implement the inherited abstract method ITuning.doRace(Object)
But if do chage it to Object, i can't use it in my Car class…
public interface ITuning
{
abstract void doRace(Object o1);
}
public Car extends Vehicle implements ITuning
{
public void doRace(Car o1){
if(this.getHp() > o1.getHp())
};
}
Any Idea what i'm doing wrong? I assume its a comprehension error
CodePudding user response:
You can make ITuning
generic.
public interface ITuning<T> {
void doRace(T other);
}
Implementation will be like this:
public class Car extends Vehicle implements ITuning<Car> {
@Override
public void doRace(Car other) {
//do comparison
}
}
Implementation in other classes will be quite similar, just change the generic parameter.
As a side note, i would rename the interface to something more fitting. Considering that tuning a vehicle is the act of modifying it to optimise its' performance, ITuning
providing functionality to do the actual racing is counter intuitive.
CodePudding user response:
You can change your ITuning
interface to
public interface ITuning
{
void doRace(Vehicle other);
}
Since Vehicle
defines the getHp()
method this ensures that your actual implementation can access it.
The difference to Chaosfire's answer is that this will allow you to do a race between different types of vehicles, e.g. a Car
and a Motorcycle
, while the generic ITuning<T>
class will be limited to races between equal types*.
Chaosfire's point regarding the interface name is still valid.
*This is a bit over-simplified to make my point clearer. Of course Car
could implement ITuning<Car>
and ITuning<Motorcycle>
but this may not be what you want.