У меня есть
public enum BaseActions implements Actions{
STAND (0,0,0),
TURN (1,1,1);
//other stuff
}
public enum CoolActions implements Actions{
STAND (0,2,3),
TURN(1,6,9);
//other stuff
}
public enum LooserActions implements Actions{
STAND (0,-2,-3),
TURN(1,-6,-9);
//other stuff
}
public interface Actions {
//interface methods
}
class A {
Actions mCurrentAction;
protected void notifyNewAction(final Actions pAction, final Directions pDirection){
//body of the method
}
public void doStuff(final Actions pAction) {
if(pAction.getMyId() > 0)
notifyNewAction(BaseActions.STAND, myDirection);
else
notifyNewAction(BaseActions.TURN, myDirection);
}
}
class B extends A{
public void doMyStuff() {
doStuff(CoolActions.STAND);
}
}
class C extends A{
public void doMyStuff() {
doStuff(LooserActions.STAND);
}
}
Я хотел бы, чтобы A использовал CoolActions, когда doStuff вызывается из B, и LooserActions, когда вызывается из C. Один из способов, которые я думаю, что я могу сделать, это использовать дженерики,а затем в B и C использовать
doStuff<CoolActions>(CoolActions.STAND)
и иметь в A
public void doStuff<T extends EnumActions&Actions>(final Actions pAction) {
if(pAction.getMyId() > 0)
notifyNewAction(T.STAND, myDirection);
else
notifyNewAction(T.TURN, myDirection);
}
, где EnumActions является базовым перечислением, которое просто содержит объявление элементов перечисления, и ничего более, что-токак интерфейс для перечислений, но перечисления не могут расширять другой класс, так как они уже расширяют Enum, и интерфейс не может обеспечить то, что я имею в виду.Другой способ - сделать так, чтобы перечисления реализовывали интерфейс EnumActions, который имеет
public interface EnumActions {
public <T> T getStand();
public <T> T getTurn();
}
и имеет
class A {
Actions mCurrentAction;
protected void notifyNewAction(final Actions pAction, final Directions pDirection){
//body of the method
}
public <T implements EnumActions> void doStuff(final Actions pAction) {
if(pAction.getMyId() > 0)
notifyNewAction(T.getStand(), myDirection);
else
notifyNewAction(T.getTrun(), myDirection);
}
}
и
public enum CoolActions implements Actions, EnumActions{
STAND (0,2,3),
TURN(1,6,9);
public CoolActions getStand();
public CoolActions getTurn();
//other stuff
}
class B extends A{
public void doMyStuff() {
doStuff<CoolActions>(CoolActions.STAND);
}
}
Но 1) я нене знаю, сработает ли это 2) я теряю преимущества использования перечислений 3) этот шов - очень плохой способ справиться с этим 4) мне пришлось бы писать много (X полей перечисления на Y различных перечислений).Я изменил со статических полей final на enum, чтобы улучшить читаемость и порядок, и эти швы сделают вещи еще сложнее.
Я проектирую это неправильно?Как я могу справиться с этим?Есть ли предпочтительный способ решения этой проблемы?Спасибо