我有以下问题。我必须在makeLeftTurnMethod内部进行投射...这对我来说看起来非常难看..有没有办法我不必这样做?
public interface Car(){
public void turnRight();
public void turnLeft();
public void go();
}
public class LuxuryCare implements Car(){
public void systemCheckRightSideClear();
public void systemCheckLeftSideClear();
}
public class UsedCar implements Car(){
public void personCheckRightSideClear();
public void personCheckLeftSideClear();
}
public interface Run{
public void makeLeftTurn();
}
public class RunLuxuryCar implements Run{
public void makeLeftTurn(Car car){
car = (LuxuryCar)car;
car.systemCheckLeftSideClear();
car.turnLeft();
}
}
public class RunUsedCar implements Run{
public void makeLeftTurn(Car car){
car = (UsedCar)car;
car.personCheckLeftSideClear();
car.turnLeft();
}
}
public void tester(){
//Could return either used or luxuy car
Run run = RunFactory.getInstance(UsedCar);
Car car = CarFacory.getInstance(usedCar);
run.makeLeftTurn(car);
}
答案 0 :(得分:1)
这是我对你的意图的最好猜测,修复了语法错误并使用泛型消除了强制转换:
public static interface Car{
public void turnRight();
public void turnLeft();
public void go();
}
public abstract class LuxuryCar implements Car{
public void systemCheckRightSideClear(){}
public void systemCheckLeftSideClear(){}
}
public abstract class UsedCar implements Car{
public void personCheckRightSideClear(){};
public void personCheckLeftSideClear(){};
}
public interface Run<T extends Car> {
public void makeLeftTurn(T car);
}
public class RunLuxuryCar implements Run<LuxuryCar>{
@Override
public void makeLeftTurn(LuxuryCar car){
car.systemCheckLeftSideClear();
car.turnLeft();
}
}
public class RunUsedCar implements Run<UsedCar>{
@Override
public void makeLeftTurn(UsedCar car){
car.personCheckLeftSideClear();
car.turnLeft();
}
}
答案 1 :(得分:0)
简单的答案是,您的界面应始终表达可执行的所有操作。如果某些实现实现某些方法没有意义,那么您的抽象是错误的。在这种情况下,您的问题表明您的Car
接口需要isLuxuryCar()
和isUsedCar()
方法,以便除了需要为每个方法调用的相应方法之外,您还可以区分它们。之一。
更进一步,这不是继承的真正含义。您所展示的内容是我希望在教科书或Java入门中找到的内容,而且对于继承的内容是错误的看法。继承和多态性都是关于代码重用的,我发现继承关系发现比它们计划更频繁。当您发现在相关对象中编写类似的代码时,您会发现它们,此时您从中提取一个共同的超类以将代码合并到一个位置。