我有一个抽象类,我想强制它的子类引用一个Enum成员。这是我所拥有的简化版本:
public abstract class Action {
public static enum ImpactType {
Size(2), Position(2), Scale(1)
final int elements;
private ImpactType (int elements){
this.elements = elements;
}
}
protected abstract ImpactType impactType();
protected abstract apply(float value, int element);
public void apply(float value) {
for (int i=0; i<impactType.elements; i++)
apply(value, i);
}
}
和一个示例实现:
public class PositionAction extends Action {
Vector2 target;
public PositionAction(Vector2 target){
this.target= target;
}
protected ImpactType impactType(){ return ImpactType.Position; };
protected abstract apply(float value, int element){
switch (element){
case 0:
target.x = value;
break;
case 1:
target.y = value;
break;
}
}
}
问题在于,这并没有强制impactType
方法每次都返回相同的内容。实际上,子类的两个不同实例可能会返回不同的ImpactType
,但我需要确保每个子类都锁定到枚举的单个成员,因为我正在对这些对象执行其他操作。有关如何解决这个问题的想法吗?
答案 0 :(得分:2)
您可以通过要求子类在构造上提供ImpactType来强制执行限制。
public abstract class Action {
private final ImpactType m_impactType;
Action( ImpactType impactType ) {
m_impactType = impactType;
}
protected final ImpactType impactType() {
return m_impactType;
}
...
}
然后您的子类可以通过super()
提供影响类型:
public class PositionAction extends Action {
private Vector2 target;
public PositionAction(Vector2 target){
super( ImpactType.Position );
this.target= target;
}
...
}
答案 1 :(得分:1)
不能覆盖最终方法。这允许您锁定实现,以便子类不能更改它。
protected final ImpactType impactType(){ return ImpactType.Position; };
或者,您可以像@javaguest建议的那样做,只需将ImpactType设置为带有公共getter的私有final字段。