【问题标题】:Abstract Method / Avoid Casting抽象方法/避免强制转换
【发布时间】:2013-10-09 02:04:32
【问题描述】:

我有这个代码:

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 ...(我们正在从接口转换为类 .. 似乎有点尴尬)... 提出这个问题的另一种方法是:还有其他方法可以设置此代码吗? 干杯!

【问题讨论】:

  • 您需要澄清一些代码示例。 Position.setX() 和 Position.setY() 是否应该没有参数? ComplicatedPosition 是类还是接口?只有接口可以扩展其他接口,但接口不能有例子中的实现。
  • 感谢@Dev 我刚刚进行了编辑;-)

标签: java oop abstract-class


【解决方案1】:

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

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 方法。

【讨论】:

  • 谢谢 .. 澄清一下:Mover 应该给一个新职位 ;-)
  • @MadSeb 啊好吧,我被甩了,因为你的 ComplicatedMover 再次返回 q ;)
【解决方案2】:

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

throw new UnsupportedOperationException("");

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

public class StandardPosition extends PositionAdapter {
}

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

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多