que tiene una interfaz similar a la siguiente:Java: Interfaces que contienen enumeraciones internas; funcionalidad se extiende en clases de implementación
package example;
import java.awt.Point;
public interface Thing {
public enum MovingState {
MOVING_LEFT,
MOVING_UP,
MOVING_RIGHT,
MOVING_DOWN
}
public void setNewPosition(MovingState state);
public Point getPosition();
}
y una clase de implementación:
package example;
import java.awt.Point;
public class ThingImpl implements Thing {
public enum MovingState {
MOVING_LEFT (-1, 0),
MOVING_UP (0, -1),
MOVING_RIGHT (1, 0),
MOVING_DOWN (0, 1);
private int x_move;
private int y_move;
MovingState(int x, int y) {
x_move = x;
y_move = y;
}
public int xMove() {
return x_move;
}
public int yMove() {
return y_move;
}
}
private Point position;
public void setNewPosition(MovingState state) {
position.translate(state.xMove(), state.yMove());
}
public Point getPosition() {
return position;
}
}
La idea es tener MovingState
en ThingImpl
extienden MovingState
desde la interfaz Thing
(por lo tanto separando la implementación real de MovingState
de la interfaz).
Esto no funciona, aunque - la enumeración MovingState
en ThingImpl
sombras la definición de la interfaz en lugar de extenderlo, entonces el compilador se queja de que ThingImpl no es abstracta y no reemplazar el método abstracto setNewPosition (Thing.MovingState) en Cosa.
¿Hay una manera real de hacer lo que estoy tratando de lograr? ¿O simplemente Java no tiene esta capacidad?
-1 - no es correcto, no está haciendo el antipatrón. Lo que está haciendo es estúpido, pero no es el patrón de interfaz constante específicamente porque su interfaz * define el comportamiento *, y no sirve para mantener valores constantes. Definir constantes en una interfaz es correcto. IFF se debe usar junto con el comportamiento de la interfaz. – MetroidFan2002
Sí, supongo que es correcto y merezco el voto abajo. sin embargo, el enfoque es un paso en la dirección incorrecta y creo que mi consejo sobre cómo convertir sus constantes de tipo MOVING_LEFT en métodos (posiblemente en una clase abstracta) sigue siendo bueno ... – hvgotcodes
Podría hacerlo, claro, pero luego su interfaz sufrirá si realmente quiere agregar direcciones adicionales. ¿Qué hay de mover diagonalmente hacia arriba a la izquierda? Ese es otro método, pero solo una constante enumerada adicional. Incluso podría hacer enumeraciones más esotéricas: moverse de lado, arriba y abajo. Tener cada uno implementado como un método separado hace que la interfaz se inflame. – MetroidFan2002