Как расширить класс enum из абстрактного класса?
Имея что-то вроде этого:
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
, Например. Добавлять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
класс, который я могу легко использовать в разных проектах, обрабатывая различные типы ввода.