Что-то вроде этого:
public enum Token
{
FOO("foo", "f"),
QUIT("quit", "q"),
UNKNOWN("", "");
...
public parse(String s) {
for (Token token : values()) {
...
return token;
}
return UNKNOWN;
}
}
Абстрактный класс:
abstract class Base
{
private boolean run;
Base() {
run = true;
while (run) {
inp = getInput();
act(inp);
}
}
public boolean act(String s) {
boolean OK = true;
switch (Token.parse(inp)) { /* Enum */
case FOO:
do_foo();
break;
case QUIT:
run = false;
break;
case UNKNOWN:
print "Unknown" + inp;
OK = false;
break;
}
}
return OK;
}
}
И расширитель:
class Major extends Base
{
}
Я хочу расширить act
, как и в случае, если super
не обрабатывает его, а затем попытайтесь обработать его в Major
. Например. add PRINT_STAT("print-statistics", "ps")
- но в то же время пусть класс Base
обрабатывает по умолчанию как QUIT
.
Это совершенно неправильный подход?
Что я сделал до сих пор, так это добавить интерфейс Обычно:
public interface BaseFace
{
public boolean act_other(String inp);
}
И в классе Base implements BaseFace
:
case UNKNOWN:
OK = act_other(inp);
И в классе Major
:
public boolean act_other(String inp) {
if (inp.equals("blah")) {
do_blah();
return true;
}
return false;
}
Это похоже на полезный дизайн?
И, главный вопрос:
Есть ли какой-нибудь хороший способ расширить класс Token
, чтобы я мог использовать тот же подход переключения в Major
, что и в Base
? Я задаюсь вопросом, есть ли для этого лучший дизайн и второй, если мне нужно создать новый класс Token для Major
или если я каким-то образом продлю или иным образом повторно использую существующие.
Изменить: точка зрения состоит в том, чтобы иметь класс Base
, который я могу легко использовать в разных проектах, обрабатывающих различные типы ввода.