java - 如何强制子类不断引用枚举?

标签 java enums

我有一个抽象类,我想强制它的子类引用 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,但我需要确保每个子类都被锁定到枚举的单个成员,因为我正在执行其他操作这些物体。有什么想法可以解决这个问题吗?

最佳答案

您可以通过要求子类在构造时提供 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;
    }
    ...
}

关于java - 如何强制子类不断引用枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152779/

相关文章:

c# - 如何将枚举转换为 List<SelectListItem>?

c# - 获取数组中的枚举元素

java - 如何判断数据库中的表是否存在?

typescript - 如何键入带枚举的函数

java - 使用 Jackson 创建平面对象形式的嵌套 json

java - 不幸的是,<应用程序名称>已停止

Java:泛型只接受枚举类型

powershell - ExtendedPropertyDefinition ID 是否有公共(public)枚举?

java - 作为 TCP 服务器的 EJB 单例

java - Google-Eclipse 插件是否自动生成 war 目录内容?