我有一个基类和两个派生类,它们似乎都使用相同的枚举。 我想在基类中使用枚举,但根据所使用的派生类的实例更改分配的值。 我该怎么做?
基类:
public class Base {
private MyEnum data = MyEnum.Z;
public Base() {
}
public void baseMethod() {
System.out.println("base data:? "+MyEnum.X);
data = MyEnum.Y;
data.showVal();
System.out.println("base value:? "+data);
}
//enum yet to be added
protected enum MyEnum {
X(0,2),
Y(1,3),
Z(4,5);
private int a,b;
MyEnum(int x, int y) {
a=x;
b=y;
}
public void showVal() {
System.out.println("a="+a+",b="+b);
}
}
}
两个派生类:
public class A extends Base {
private MyEnum data = MyEnum.Z;
public A () {
}
public void firstMethod() {
System.out.println("A's DATA: "+MyEnum.X);
data = MyEnum.Y;
data.showVal();
System.out.println("A's value: "+data);
baseMethod();
}
protected enum MyEnum {
//values are different
X(10,11),
Y(12,13),
Z(14,15);
private int a,b;
MyEnum(int x, int y) {
a=x;
b=y;
}
public void showVal() {
System.out.println("a="+a+",b="+b);
}
}
}
public class B extends Base {
private MyEnum data = MyEnum.Z;
public B() {
}
public void secondMethod() {
System.out.println("B'S DATA: "+MyEnum.X);
data = MyEnum.Y;
data.showVal();
System.out.println("B's value: "+data);
baseMethod();
}
protected enum MyEnum {
//values are different
X(20,21),
Y(22,23),
Z(24,25);
private int a,b;
MyEnum(int x, int y) {
a=x;
b=y;
}
public void showVal() {
System.out.println("a="+a+",b="+b);
}
}
}
请帮忙。
最佳答案
Enums are basically final classes that you can't extend 。您可以在枚举中实现接口(interface),但不能扩展枚举来更改其方法之一或枚举的具体值(您所引用的一对整数)。
如果您想继续使用枚举,可以考虑的解决方案是使用带有 X、Y、Z
的单个 MyEnum
枚举,并添加 showVal (MyEnum value)
对象 Base
、A
和 B
中的方法。 showVal
方法只需将正确的整数对与所有枚举值(X
、Y
和 Z
)。
以下是此方法的逻辑:
MyEnum.java
public enum MyEnum{
X,Y,Z
}
Main.java
public class Main{
public static void main(String []args){
MyEnum value = MyEnum.X;
System.out.println("With Base:");
Base base = new Base();
System.out.println(base.showVal(value));//prints "a=0,b=2"
System.out.println("With A:");
A a = new A();
System.out.println(a.showVal(value)); //prints "a=10,b=11"
System.out.println("With B:");
B b = new B();
System.out.println(b.showVal(value)); //prints "a=20,b=21"
}
}
Base.java
public class Base{
public Base(){
//Do something...
}
public String showVal(MyEnum value){
switch(value){
case MyEnum.X:
return "a=0,b=2";
case MyEnum.Y:
return "a=1,b=3";
case MyEnum.Z:
return "a=4,b=5";
}
}
}
A.java
public class A extends Base{
public A(){
//Do something...
}
@Override
public String showVal(MyEnum value){
switch(value){
case MyEnum.X:
return "a=10,b=11";
case MyEnum.Y:
return "a=12,b=13";
case MyEnum.Z:
return "a=14,b=15";
}
}
}
B.java
public class B extends Base{
public B(){
//Do something...
}
@Override
public String showVal(MyEnum value){
switch(value){
case MyEnum.X:
return "a=20,b=21";
case MyEnum.Y:
return "a=22,b=23";
case MyEnum.Z:
return "a=24,b=25";
}
}
}
如果您不介意更改结构,请使用对象来存储表示 X
、Y
或 Z
的状态。您将能够扩展该父对象并在子对象中提供您想要的任何整数部分。
关于java - 基于派生类在基类中以编程方式分配枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922878/