有這樣的事情:如何從抽象類擴展枚舉類?
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
{
}
我想是在如果super
不處理擴展act
然後嘗試在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
類,這樣我可以在Base
使用Major
相同的開關方法,因爲一些好的方法嗎?我想知道的是,如果一個是更好的設計,如果我不得不爲Major
創建一個新的令牌類,或者如果我以某種方式可以擴展或以其他方式重新使用現有的。
編輯:概念的一點是有Base
類,我可以很容易地重新使用在不同的項目處理各種類型的輸入。
有用的鏈接來完成教程:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9 – Aubin 2013-03-16 15:25:40
謝謝。我讀了那篇,但顯然沒有抓到所有東西。我會看看界面方法。像你的頭像順便說一句:)。並感謝@Aubin, - 額外的鏈接。還沒有讀過斑點,但看起來像我應該。它看起來像我喜歡的語言。 – Zimzalabim 2013-03-16 15:36:11
在類似的情況下,我想從一個抽象基類繼承非平凡的實現,最後我以一個枚舉作爲實例成員。 – 2013-03-16 15:41:03