Java 具有不同类型子类的对象,包括枚举
Java Object with subclasses of different type including enum
我喜欢top/down而不是bottom/up,所以这里直接是我的最终目标:
我的目标:
使用不同的“PlQryElement”构建的“aQuery”(Pl 代表 'Playlist',因为这里的上下文是 'smart playlist' 音乐播放列表管理器):
List<PlQry_Element> aQuery = new ArrayList<PlQry_Element>();
我显然应该实例化 'PlQry_Elements',然后使用 aQuery.add(...);
。建立我的最终查询的结果。
这是可能的“PlQry_Element”:
- A "PlQryEl_Parentese"(打开或关闭,括号)--> 我为此使用了 'enum'
- A "PlQryEl_Condition"(一个有它自己建立的条件)--> 我为此使用了一个特定的对象
- A "PlQryEl_BoolOperator"(本质上是 'AND' / 'OR')--> 我为此使用了 'enum'
我会怎么想:
- 使用摘要class:所有“PlQryEl_...”都应该是摘要class“PlQryElement”的子classes。但这显然不适用于 'enum' ,它们不是“可实现的”。
- 另一个想法是使用多态...无法让它工作。
问题:
我怎样才能实现我的第一个目标...不将我的 'enum' 对象更改为 'classes' ?
任何帮助将不胜感激!!!提前谢谢你;-)...
这是没有 'implements' 的 classes :
PlQryEl_Parenthese -->
package application.query.element;
public enum PlQryEl_Parenthese {
PARENTHESES_OPEN("("),
PARENTHESES_CLOSE(")");
String symbol;
PlQryEl_Parenthese(String symbol) {
this.symbol = symbol;
}
};
PlQryEl_Condition -->
package application.query.element;
import application.query.element.cond.PlQryEl_Cond_Object;
import application.query.element.cond.PlQryEl_Cond_Operator;
public class PlQryEl_Condition {
PlQryEl_Cond_Object aObject = PlQryEl_Cond_Object.PLAYLIST;
String sField="";
PlQryEl_Cond_Operator aOparator = PlQryEl_Cond_Operator.EQUAL;
String sValue = "";
public PlQryEl_Condition(PlQryEl_Cond_Object aObject, String sField, PlQryEl_Cond_Operator aOparator, String sValue) {
super();
this.aObject = aObject;
this.sField = sField;
this.aOparator = aOparator;
this.sValue = sValue;
}
};
PlQryEl_BoolOperator -->
package application.query.element;
public enum PlQryEl_BoolOperator {
LINK_OR("or"),
LINK_AND("and");
String symbol;
PlQryEl_BoolOperator(String symbol) {
this.symbol = symbol;
}
};
感兴趣的是关于 'PlQryEl_Condition' class 的对象:
PlQryEl_Cond_Object -->
package application.query.element.cond;
public enum PlQryEl_Cond_Object {
PLAYLIST("Playlist","vPlaylist"),
TRACK("Track","vTrack");
String symbol;
String dbViewName;
PlQryEl_Cond_Object(String symbol, String dbViewName) {
this.symbol = symbol;
this.dbViewName = dbViewName;
}
};
PlQryEl_Cond_Operator -->
package application.query.element.cond;
public enum PlQryEl_Cond_Operator {
EQUAL("="),
GREATER(">"),
SMALLER("<"),
EMPTY("is empty (null, NA, ...)"),
INLIST("in list");
String symbol;
String dbViewName;
PlQryEl_Cond_Operator(String symbol) {
this.symbol = symbol;
}
};
答案往往隐藏在问题中...这里就是这种情况!
我采用的解决方案是在枚举周围包裹 'class' 以使它们成为 'implementable'.
这解决了,显然是这样......但它是only/best解决方案吗?
我喜欢top/down而不是bottom/up,所以这里直接是我的最终目标:
我的目标: 使用不同的“PlQryElement”构建的“aQuery”(Pl 代表 'Playlist',因为这里的上下文是 'smart playlist' 音乐播放列表管理器):
List<PlQry_Element> aQuery = new ArrayList<PlQry_Element>();
我显然应该实例化 'PlQry_Elements',然后使用 aQuery.add(...);
。建立我的最终查询的结果。
这是可能的“PlQry_Element”:
- A "PlQryEl_Parentese"(打开或关闭,括号)--> 我为此使用了 'enum'
- A "PlQryEl_Condition"(一个有它自己建立的条件)--> 我为此使用了一个特定的对象
- A "PlQryEl_BoolOperator"(本质上是 'AND' / 'OR')--> 我为此使用了 'enum'
我会怎么想:
- 使用摘要class:所有“PlQryEl_...”都应该是摘要class“PlQryElement”的子classes。但这显然不适用于 'enum' ,它们不是“可实现的”。
- 另一个想法是使用多态...无法让它工作。
问题: 我怎样才能实现我的第一个目标...不将我的 'enum' 对象更改为 'classes' ?
任何帮助将不胜感激!!!提前谢谢你;-)...
这是没有 'implements' 的 classes :
PlQryEl_Parenthese -->
package application.query.element;
public enum PlQryEl_Parenthese {
PARENTHESES_OPEN("("),
PARENTHESES_CLOSE(")");
String symbol;
PlQryEl_Parenthese(String symbol) {
this.symbol = symbol;
}
};
PlQryEl_Condition -->
package application.query.element;
import application.query.element.cond.PlQryEl_Cond_Object;
import application.query.element.cond.PlQryEl_Cond_Operator;
public class PlQryEl_Condition {
PlQryEl_Cond_Object aObject = PlQryEl_Cond_Object.PLAYLIST;
String sField="";
PlQryEl_Cond_Operator aOparator = PlQryEl_Cond_Operator.EQUAL;
String sValue = "";
public PlQryEl_Condition(PlQryEl_Cond_Object aObject, String sField, PlQryEl_Cond_Operator aOparator, String sValue) {
super();
this.aObject = aObject;
this.sField = sField;
this.aOparator = aOparator;
this.sValue = sValue;
}
};
PlQryEl_BoolOperator -->
package application.query.element;
public enum PlQryEl_BoolOperator {
LINK_OR("or"),
LINK_AND("and");
String symbol;
PlQryEl_BoolOperator(String symbol) {
this.symbol = symbol;
}
};
感兴趣的是关于 'PlQryEl_Condition' class 的对象:
PlQryEl_Cond_Object -->
package application.query.element.cond;
public enum PlQryEl_Cond_Object {
PLAYLIST("Playlist","vPlaylist"),
TRACK("Track","vTrack");
String symbol;
String dbViewName;
PlQryEl_Cond_Object(String symbol, String dbViewName) {
this.symbol = symbol;
this.dbViewName = dbViewName;
}
};
PlQryEl_Cond_Operator -->
package application.query.element.cond;
public enum PlQryEl_Cond_Operator {
EQUAL("="),
GREATER(">"),
SMALLER("<"),
EMPTY("is empty (null, NA, ...)"),
INLIST("in list");
String symbol;
String dbViewName;
PlQryEl_Cond_Operator(String symbol) {
this.symbol = symbol;
}
};
答案往往隐藏在问题中...这里就是这种情况!
我采用的解决方案是在枚举周围包裹 'class' 以使它们成为 'implementable'.
这解决了,显然是这样......但它是only/best解决方案吗?