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