2

我有这个代码:

public interface Position {
  public int getX();
  public int setX(int x);
  public int getY();
  public int setY(int y);
}

public StandardPosition implements Position {
  // STANDARD implementation of Position here
}

public abstract class Mover {
  public abstract Position move ( Position originalPosition ); 
}

“移动器”是将某物从初始位置移动到最终位置的东西。

现在这是有趣的部分……一些移动器更复杂,并且使用更复杂的 Position 对象。

public class ComplicatedPosition extends StandardPosition {
 // ADDS Y DIMENSION
 private int y; 
 public int getY() { return(y); }
 public void setY(int y) { this.y = y ; }
}


public class MoreComplicatedMover extends Mover {

  @Override
  public void Position move(Position initialPosition) {
    ComplicatedPosition q = (ComplicatedPosition) initialPosition; 
    // Do a transformation and 
    // return a new position
    return(q); 
  }

}

我的问题是......有什么方法可以避免从 Position 转换为 ComplicatedPosition ...(我们正在从接口转换为类 .. 似乎有点尴尬)......问这个问题的另一种方法是:有没有任何其他方式来设置此代码?干杯!

4

2 回答 2

3

那么您可以做的一件事是使用泛型,例如:

public abstract class Mover<T extends Position> {
  public abstract T move(T originalPosition ); 
}

public class ComplicatedMover extends Mover<ComplicatedPosition> {
  public ComplicatedPosition move(ComplicatedPosition p) {
    //do stuff
  }
}

但是,我不确定这是否是您应该想要的。

顺便提一句; 你Mover应该给一个新的职位还是改变给定的职位?void如果您要更改给定的位置,我个人会将其作为一种方法。

于 2013-10-09T02:15:09.627 回答
0

如果用于的 APIComplicatedPosition不同StandardPosition(我认为是这样,这就是您进行强制转换的原因),请更新您的Position界面并将所有需要的 API 放在那里。然后,第一种方法是实现这些额外的方法StandardPosition并简单地放入

throw new UnsupportedOperationException("");

更好的方法是实现适配器模式并有一个抽象类,比如PositionAdapter它实现所有这些额外的方法并抛出UnsupportedOperationException然后有

public class StandardPosition extends PositionAdapter {
}

StandardPosition这样,您就不必在您的或任何其他实现类中实现一堆不需要的方法。然后你可以摆脱你的铸件并调用接口上的所有方法。希望这可以帮助。

于 2013-10-09T02:25:53.690 回答