从子类中定义的枚举调用方法 - Java

Jea*_*esi 1 java enums

我有一个抽象类Sensor,它由多个Device子类扩展.每个子类定义一个枚举.对于每个子类实例,这些枚举可以是不同的.这些枚举用于定义status实例变量.我想找到一种方法来定义getStatus()父(抽象)类中的getter方法,这样我就不必在每个子类中重新划分相同的代码行.

例如:

abstract class Sensor {
    // here I would have liked to declare a "status" variable to hold enum values from subclass
    ....... status;

    Sensor() {}

    public String getStatus() {
        // return the status defined in the subclass
        return status.name();
    }
}
class Device extends Sensor {
    enum Status { ON, OFF };

    Device() {
        super.status = Status.ON;  // store enum value into variable defined in superclass
    }
}
class Device2 extends Sensor {
    enum Status { OPEN, CLOSED, LOCKED };

    Device2() {
        super.status = Status.OPEN;
    }
}
Run Code Online (Sandbox Code Playgroud)

ILM*_*tan 5

您可以使传感器通用

class Sensor<T extends Enum<T>> {
    T status;
    protected Sensor(T status) {
        this.status = status;
    }

    public String getStatus() {
        return this.status.toString();
    }
}

class Device extends Sensor<Device.Status> {
    enum Status {On, Off}
    public Device() {
        super(Status.On);
    }
}

class Device2 extends Sensor<Device2.Status> {
    enum Status { OPEN, CLOSED, LOCKED }

    Device2() {
        super(Status.OPEN);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以将Sensor和getStatus()抽象化,而不是在Sensor中作为字段状态.

abstract class Sensor {
    public abstract String getStatus();
}

class Device extends Sensor {
    enum Status {On, Off}
    Status status = Status.On;

    public String getStatus() {
        return this.status.toString();
    }
}

class Device2 extends Sensor {
    enum Status { OPEN, CLOSED, LOCKED }
    Status status = Status.OPEN;
    public String getStatus() {
        return this.status.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)