【发布时间】:2011-10-06 00:20:33
【问题描述】:
我正在重构一些遗留代码并遇到了一个问题,我确信有一个优雅的解决方案 - 但我无法完全解决。
最初有很多类扩展了抽象类BaseType。这些类中的每一个都有一个枚举 - XmlElementTag - 具有特定于类的值:
enum XmlElementTag {value1, value2, value3}
他们每个人都有一个方法:
private XmlElementTag getTag(String s){
XmlElementTag ret = null;
try {
ret = XmlElementTag.valueOf(s);
} catch (Exception e) {
Log.e(this, s+" is not supported tag");
}
return ret;
}
每个类都有完全相同的getTag 方法,但显然它们都指的是特定于它们所在类的XmlElementTag 枚举。所以,如果可以的话,我想摆脱这个代码重复.
我想也许我可以使用一个标记接口来解决这个问题,所以创建了一个,每个XmlElementTag枚举现在都继承并重写了getTag方法并将其放入超类中。
所以我在每个班级都有这个:
private XmlElementTag implements GenericTag {value1, value2, value3};
这在 BaseType 超类中:
public interface GenericTag {}
protected GenericTag getTag(String tagName){
XmlElementTag tag = null;
try {
tag = XmlElementTag.valueOf(tagName);
} catch (Exception e) {
Log.e(this, tagName+" is not supported tag");
}
return tag;
}
但这同样不起作用,因为BaseType 超类不知道XmlElementTag 是什么; Java 不允许抽象类变量;在BaseType 中创建此元素将不起作用,因为getTag 代码将始终引用此枚举,而不是扩展BaseType 的类中的那个。
谁能指出我正确的方向?
【问题讨论】:
-
你可以在java中拥有抽象类型。
-
我的意思是抽象类变量 - 将更新以反映这一点。
-
请移除 Android 标签,因为这是一个一般的 Java 问题。
标签: java inheritance overriding superclass