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

时间:2015-09-29 06:53:47

标签: java enums

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

E.g:

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;
    }
}

3 个答案:

答案 0 :(得分: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);
    }
}

或者您可以将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();
    }
}

答案 1 :(得分:2)

既然你不能继承Java中的枚举,并且你希望枚举特定于每个子类,我会使用枚举

来创建superClass泛型

RQ:我在单个文件中添加了static个关键字以使用内部类。将它们复制到单独的类/文件中后,您可以删除它们:

static abstract class Sensor<T extends Enum<T>> {
    T status;

    Sensor() {}

    public T getStatus() {
        return status;
    }

    public String getStatusAsString() {
        return status.name();
    }
}
static class Device extends Sensor<Device.Status> {
    enum Status { ON, OFF };

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

    Device2() {
        super.status = Status.OPEN;
    }
}

答案 2 :(得分:0)

IMO枚举应该是基类的一部分,其值可以由设备修改。

abstract class Sensor {
    Sensor() {}

    enum Status { ON, OFF };

    Status status;

    public String getStatus() {
        // return the status defined in the subclass
        return status.name();
    }
}

现在将设备视为:

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

    public void setStausToOff() {
        super.status = Status.OFF;
    }
}

然后我们可以进行测试:

 public static void main(String[] args) {
        Sensor sensor1 = new Device();
        System.out.println(sensor1.getStatus());

        Device sensor2 = new Device();
        System.out.println(sensor1.getStatus());
        sensor2.setStausToOff();
        System.out.println(sensor2.getStatus());

    }

它打印出来:

ON ON OFF

注意:您可能需要根据自己的要求对其进行修改,但会给您一些提示。

如果每个Device都有自己的Enum(distict),那么它的值只对该类的实例知道,而不是基类。例如,Car是基类,VW是派生类,使用了一些独有的特殊类功能。在这种情况下,您无法在Car类中获得这些功能的价值。父类如何知道特定于子类的属性?它不能。