[英]invoke methods from enum defined in subclass - Java
我有一個抽象類Sensor,該類被多個Device
子類擴展。 每個子類都定義一個枚舉。 每個子類實例的這些枚舉可以不同。 這些枚舉用於定義status
實例變量。 我想找到一種在父(抽象)類中定義getter方法getStatus()
方法,這樣我就不必在每個子類中重復相同的代碼行。
例如:
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;
}
}
您可以使Sensor通用
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();
}
}
由於您不能從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;
}
}
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
注意:您可能需要根據需要進行修改,但這會給您一些提示。
如果在這種情況下,每個設備都具有自己的Enum(距離),則其值將僅對於該類的實例而不是對基類是已知的。 例如, Car
是基類,而VW
是派生類,它使用一些專有的特殊功能。 在這種情況下,您將無法獲得Car
類中這些功能的價值。 父類如何知道子類的特定屬性? 這不可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.