Java:包含内部枚举的接口;在实现类中扩展功能

前端之家收集整理的这篇文章主要介绍了Java:包含内部枚举的接口;在实现类中扩展功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个如下界面:
  1. package example;
  2. import java.awt.Point;
  3.  
  4. public interface Thing {
  5. public enum MovingState {
  6. MOVING_LEFT,MOVING_UP,MOVING_RIGHT,MOVING_DOWN
  7. }
  8.  
  9. public void setNewPosition(MovingState state);
  10. public Point getPosition();
  11. }

和一个实现类:

  1. package example;
  2. import java.awt.Point;
  3.  
  4. public class ThingImpl implements Thing {
  5. public enum MovingState {
  6. MOVING_LEFT (-1,0),MOVING_UP (0,-1),MOVING_RIGHT (1,MOVING_DOWN (0,1);
  7.  
  8. private int x_move;
  9. private int y_move;
  10.  
  11. MovingState(int x,int y) {
  12. x_move = x;
  13. y_move = y;
  14. }
  15.  
  16. public int xMove() {
  17. return x_move;
  18. }
  19.  
  20. public int yMove() {
  21. return y_move;
  22. }
  23. }
  24.  
  25.  
  26. private Point position;
  27.  
  28. public void setNewPosition(MovingState state) {
  29. position.translate(state.xMove(),state.yMove());
  30. }
  31.  
  32. public Point getPosition() {
  33. return position;
  34. }
  35. }

这个想法是让ThingImpl中的MovingState从Thing界面扩展MovingState(从而将MoveState的实际实现与界面分开).

这不起作用 – ThingImpl中的MovingState枚举会影响接口中的定义,而不是扩展它,然后编译器抱怨ThingImpl不是抽象的,并且不会覆盖Thing中的抽象方法setNewPosition(Thing.MovingState).

有没有实际的方法来做我想要实现的?还是Java根本没有这种能力?

解决方法

您真正想要做的是从“ThingImpl”类中删除枚举声明,并将其全部(包括其构造函数和getter)移动到Thing界面中.

让你的字段在枚举中最后记住,他们不应该被触动.

以这种方式,任何希望使用Thing界面的内容都必须使用界面中定义的枚举 – 您的问题是您有效地定义了两次,但是它应该在界面上(这只会被使用对于此接口)或公共级枚举Java文件(使用公用枚举而不是公共类).如果您的界面以外的其他功能可以合理地期望使用它,您将会成为一个公开枚举 – 在我看来,Map.Entry是一个错误的嵌套界面,因为其他类可用于映射外部的键/值对,因此它应该是它自己的界面,但我们必须生活在它:(

The idea is to have MovingState in ThingImpl extend MovingState from the Thing interface (thus separating the actual implementation of MovingState from the interface).

我不认为这是真的你的想法 – 我认为你在Thing的界面上指定的行为很好,你真的不想触摸MovingState枚举,因为它是好的.但是,如果您认为需要使用MovingState的不同实现,则可以实现名为MovingState的接口,从而可以重命名您的枚举DefaultMovingState.这是你的选择.

您的MovingState界面现在只需要在MoveState中显示的getter.两种方法.

猜你在找的Java相关文章