Mając coś takiego:Jak przedłużyć klasę enum z klasy abstrakcyjnej?
public enum Token
{
FOO("foo", "f"),
QUIT("quit", "q"),
UNKNOWN("", "");
...
public parse(String s) {
for (Token token : values()) {
...
return token;
}
return UNKNOWN;
}
}
abstrakcyjna klasa:
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;
}
}
i przedłużacz:
class Major extends Base
{
}
Co chcę jest rozszerzenie act
jak na razie super
nie obsługuje następnie próbuje obsłużyć go w Major
. Na przykład. dodaj PRINT_STAT("print-statistics", "ps")
- ale jednocześnie niech domyślny uchwyt klasy Base
będzie domyślny jak QUIT
.
Czy to całkowicie błędne podejście?
co zrobiłem do tej pory, to dodać interfejs Zazwyczaj:
public interface BaseFace
{
public boolean act_other(String inp);
}
aw klasie Base implements BaseFace
:
case UNKNOWN:
OK = act_other(inp);
A w klasie Major
:
public boolean act_other(String inp) {
if (inp.equals("blah")) {
do_blah();
return true;
}
return false;
}
to wygląda jak użyteczny projekt?
I główne pytanie:
Czy jest jakiś dobry sposób na rozszerzenie klasy Token
tak, że można używać tego samego podejścia przełącznika w Major
jak w Base
? Zastanawiam się, czy istnieje jeden lepszy projekt, a drugi, jeśli muszę utworzyć nową klasę tokenów dla Major
lub jeśli w jakiś sposób mogę rozszerzyć lub w inny sposób ponownie użyć istniejącego.
Edit: Punkt koncepcji jest mieć klasę Base
że mogę łatwo ponownego wykorzystania w różnych projektach zajmujących się różnego rodzaju wejścia.
Przydatny link do samouczka: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9 – Aubin
Dzięki. Czytałem to, ale oczywiście nie złapałem wszystkiego. Przyjrzę się interfejsowi. Podobnie jak twój awatar btw :). I dziękuję @Aubin, - za dodatkowy link. Nie czytałem jeszcze drobin, - ale wygląda na to, że powinienem.Wygląda na to, że jestem w języku, który lubię. – Zimzalabim
W podobnej sytuacji, w której chciałem dziedziczyć nietrywialną implementację z abstrakcyjnej klasy bazowej, otrzymałem wyliczenie jako element instancji. –