Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从子类Java中定义的枚举调用方法_Java_Enums - Fatal编程技术网

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

从子类Java中定义的枚举调用方法,java,enums,Java,Enums,我有一个抽象类Sensor,它由多个设备子类扩展。每个子类定义一个枚举。对于每个子类实例,这些枚举可以不同。这些枚举用于定义状态实例变量。我想找到一种在父抽象类中定义getter方法getStatus的方法,这样就不必在每个子类中重复相同的代码行 例如: 依我看,枚举应该是基类的一部分,其值可以由设备修改 abstract class Sensor { Sensor() {} enum Status { ON, OFF }; Status status; p

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

例如:


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

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());

    }
它会打印:

在 在…上 关

注意:您可能需要根据您的要求修改它,但它会给您一些提示


如果每个设备都有自己的Enum distict,在这种情况下,它的值只会被该类的实例知道,而不会被基类知道。例如,Car是基类,VW是派生类,使用了一些特殊的特性。在这种情况下,您无法在汽车类中获得这些功能的价值。父类如何知道特定于子类的属性?不能。在我看来,枚举应该是基类的一部分,其值可以由设备修改

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());

    }
它会打印:

在 在…上 关

注意:您可能需要根据您的要求修改它,但它会给您一些提示


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

您可以使传感器通用

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

你可以使传感器通用

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

由于在Java中不能从枚举继承,并且希望枚举特定于每个子类,因此我将使用枚举使超类成为泛型

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


由于在Java中不能从枚举继承,并且希望枚举特定于每个子类,因此我将使用枚举使超类成为泛型

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


这可以帮助您:为什么不将enum声明为与子类分离的呢。为什么要将其嵌套在设备中每个设备都有不同的枚举值。。。e、 g.:{ON,OFF},或{LISTENING,IDLE},{OPEN,CLOSED,LOCKED},等等……这可以帮助您:为什么不将enum声明为独立于子类。为什么要将其嵌套在设备中每个设备都有不同的枚举值。。。e、 g.:{ON,OFF},或{LISTENING,IDLE},{OPEN,CLOSED,LOCKED},等等……但是OP提到了每个子类的枚举常量的不同值。那么OP应该维护所有这些不同的枚举常量值吗?@akhil_mittal:如果我可以覆盖枚举,那就行了,这是不可能的。但是OP提到了每个子类的枚举常量的不同值。那么OP应该维护所有这些不同的枚举常量值集吗?@akhil_mittal:如果我可以覆盖枚举,那就行了,这是不可能的。RQ:我意识到这是@ILMTitan ANSWERK的90%副本,它是在我写这个答案时发布的。我很喜欢更改后的方法名称。@ILMTitan:谢谢。如果愿意,请继续并更新您的答案,以添加getStatusAsString。RQ:我知道这是@ILMTitan answer的90%副本,它是在我编写此答案时发布的。我确实喜欢更改后的方法名称。@ILMTitan:谢谢。如果愿意,请继续并更新您的答案以添加getStatusAsString。