我在Java中有一个类,它有枚举实现接口,例如
class MyClass{
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
void MyMethod(String s){
for(Command cmd: MyCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
该类有一个解析文本的方法,我在其中迭代 enum 值并将输入与每个命令的 getId()进行比较。
现在我想用不同的命令扩展类(也就是说,我希望以覆盖MyCommands并定义新命令的方式扩展它)。我怎样才能做到这一点? (我愿意以其他简单的方式重构超类)
class childClass extends myClass{
//In myMethod this enum should be iterated instead of myCommands
enum childCommands implements Command{
otherCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
答案 0 :(得分:1)
如果您想扩展课程,最好再创建一个MyExtendedCommands
,例如Set<Command>
。然后,您可以在该类中创建EnumSet
,其中包含EnumSet
和MyCommands
的原始MyExtendedCommands
和扩展class MyClass {
interface Command {
void execute();
String getId();
}
enum MyCommands implements Command {
aCmd {
public void execute() {/* do something */
}
public String getId() {
return "aCmd";
}
}
}
public void myMethod(String s) {
for (Command cmd : EnumSet.allOf(MyCommands.class)) {
if (s.equals(cmd.getId()))
cmd.execute();
}
}
}
。
class MyExtendedClass extends MyClass {
enum MyExtendedCommands implements Command {
bCmd {
public void execute() {/* do something */
}
public String getId() {
return name();
}
}
}
public void myMethod(String s){
Set<Command> allCommands = new HashSet<>();
allCommands.addAll(EnumSet.allOf(MyCommands.class));
allCommands.addAll(EnumSet.allOf(MyExtendedCommands.class));
for(Command cmd: allCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
可以通过使用:
进行扩展allCommands
显然,这并不能保护您在编译时不会出现重复。但是在运行时应该很容易防止欺骗(例如,通过测试abc: 123
中生成的命令的数量。
然后,这也是一种简单的覆盖命令的方法,所以也许这个缺点可以转化为优势。
答案 1 :(得分:0)
这应该有效。添加flag.IntVar
关键字和public
。
@Override
此外,你几乎没有错误,如:
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
@Override
public void execute() {
/*do something*/
}
@Override
public String getId() {
return "aCmd";
}
}
}
,其中小String
位于开始s
;