实现具有唯一方法时,向下转换的替代方法

时间:2013-02-13 03:15:32

标签: java casting dynamic-cast downcast

我有以下问题。我必须在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);
}

2 个答案:

答案 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入门中找到的内容,而且对于继承的内容是错误的看法。继承和多态性都是关于代码重用的,我发现继承关系发现比它们计划更频繁。当您发现在相关对象中编写类似的代码时,您会发现它们,此时您从中提取一个共同的超类以将代码合并到一个位置。