Wie erweitert man die Aufzählungsklasse von der abstrakten Klasse?
So etwas zu haben:
public enum Token
{
FOO("foo", "f"),
QUIT("quit", "q"),
UNKNOWN("", "");
...
public parse(String s) {
for (Token token : values()) {
...
return token;
}
return UNKNOWN;
}
}
Eine abstrakte Klasse:
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;
}
}
Und der Extender:
class Major extends Base
{
}
Was ich will, ist zu verlängernact
als obsuper
nicht damit umgehen, dann versuchen Sie es inMajor
. Z.B. hinzufügenPRINT_STAT("print-statistics", "ps")
- aber gleichzeitig lassen dieBase
Klasse behandeln Standardeinstellungen wieQUIT
.
Ist das ein völlig falscher Ansatz?
Was ich bisher getan habe, ist das Hinzufügen einer Schnittstelle.
public interface BaseFace
{
public boolean act_other(String inp);
}
Und im UnterrichtBase implements BaseFace
:
case UNKNOWN:
OK = act_other(inp);
Und im UnterrichtMajor
:
public boolean act_other(String inp) {
if (inp.equals("blah")) {
do_blah();
return true;
}
return false;
}
Sieht das nach einem brauchbaren Design aus?
Und die Hauptfrage:
Gibt es eine gute Möglichkeit, dieToken
Klasse so, dass ich den gleichen Switch-Ansatz in verwenden kannMajor
wie inBase
? Was ich mich frage ist, ob es zum einen ein besseres Design gibt und zum anderen, ob ich eine neue Token-Klasse für machen mussMajor
oder wenn ich das bestehende irgendwie erweitern oder anderweitig weiterverwenden kann.
Edit: Sinn und Zweck ist es, die zu habenBase
Klasse, die ich problemlos in verschiedenen Projekten wiederverwenden kann, die verschiedene Arten von Eingaben verarbeiten.