РЕДАКТИРОВАТЬ:
Чтобы было ясно: тот факт, что дизайн довольно уродлив, не имеет значения. Дело в том, что дизайн есть, и я должен добавить еще один подкласс FlyingMotorizedVehicle
, который не будет работать должным образом, если я забуду добавить foo(...)
. Поэтому мне просто было интересно, могу ли я переопределить его как абстрактный.
Я сейчас сталкиваюсь с довольно странной ситуацией наследования. Допустим, у меня есть три класса: Vehicle
, MotorizedVehicle
и FlyingMotorizedVehicle
, а также несколько классов Airplane
, Helicopter
,...:
public abstract class Vehicle {
abstract Something doStuff(...);
abstract SomethingElse doOtherStuff(...);
abstract Foo bar(...);
}
public class MotorizedVehicle extends Vehicle {
@Override
Something doStuff(...) {
return new Something();
}
@Override
SomethingElse doOtherStuff(...) {
return new SomethingElse();
}
@Override
Foo bar(...) {
return new Foo();
}
}
public class FlyingMotorizedVehicle extends MotorizedVehicle {
@Override
SomethingElse doOtherStuff(...) {
return new SomethingElse();
}
}
public class Airplane extends FlyingMotorizedVehicle {
@Override
Foo bar(...) {
//do something different
return new Foo();
}
}
public class Helicopter extends FlyingMotorizedVehicle {
@Override
Foo bar(...) {
//do something totally different
return new Foo();
}
}
[...]
Итак, Vehicle
— это абстрактный класс, предоставляющий некоторые абстрактные методы. MotorizedVehicle
является подклассом Vehicle
с конкретными реализациями его методов. FlyingMotorizedVehicle
снова является подклассом MotorizedVehicle
, переопределяющим реализации подмножества методов MotorizedVehicle
s.
Теперь есть подклассы Helicopter
, Airplane
и, возможно, некоторые другие, которые в примере переопределяют конкретную реализацию MotorizedVehicle#bar(...)
. Я хочу «заставить» каждый подкласс MotorizedVehicle
переопределять метод bar(...)
и предоставлять свою собственную реализацию.
Можно ли просто изменить FlyingMotorizedVehicle
следующим образом:
public class FlyingMotorizedVehicle extends MotorizedVehicle {
@Override
SomethingElse doOtherStuff(...) {
return new SomethingElse();
}
abstract Foo bar(...);
}
Так что я просто переопределяю bar(...)
как абстрактный метод? Моя IDE на это не жалуется, но это, конечно, не значит, что она действительно будет работать.
Надеюсь, вы поняли, на что я пытаюсь указать здесь.
заранее спасибо
блудди