2016-05-15 4 views
-1

У меня есть класса в Java, который имеет перечисление реализует интерфейс , такие какПереопределение перечисления в 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(); 
    } 
} 
} 

Класс имеет метод для разбора текста, в котором я перебирать значения перечислены и сравнить их с 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";} 
     } 
} 
+1

Если по '" расширить класс "' вы имеете в виду создать новое перечисление, которое расширяет этот, то вы не можете этого сделать. –

+0

@MaartenBodewes Я имею в виду, я хочу создать новый класс, который расширяет мой класс, поведение - это точно то же самое, но имеет разные команды. – Jsevillamol

+1

Почему? Что за дизайн этого требования? – Kayaman

ответ

1

Если вы хотите расширить свой класс он вероятно, лучше создать дополнительный enum, например 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.

Далее, это простой способ переопределить команды, так что, возможно, этот недостаток можно превратить в преимущество

0

Это должно работать. Добавьте ключевое слово 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 с в самом начале
  • Missing ; небольшого s в return "aCmd"
+0

NikolasCharalambidis Я должен согласиться с @MaartenBodewes. Извините, если вопрос неясен. – Jsevillamol

+0

Напомню себе, чтобы указать, что * * было задано непосредственно вместо неконструктивного, «который не был задан». Итак, давайте попробуем еще раз: этот ответ не расширяет класс дополнительными командами, как указано в вопросе: «Теперь я хочу расширить класс с помощью разных команд». Надеюсь, все в порядке. –

+0

Прекрасно, не проблема. Я вижу, что я ошибался. Спасибо за комментарии. –

Смежные вопросы