- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有这样的东西:
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
。
这是一个完全错误的方法吗?
到目前为止我所做的是添加一个接口(interface) 通常:
public interface BaseFace
{
public boolean act_other(String inp);
}
在类Base中实现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
中相同的切换方法?我想知道是否有一个更好的设计,第二个是我是否必须为 Major
创建一个新的 Token 类,或者我是否可以扩展或以其他方式重用现有的。
编辑:概念的重点是拥有 Base
类,我可以在处理各种类型的输入的不同项目中轻松地重用它。
最佳答案
所有枚举都隐含地扩展枚举。在 Java 中,一个类最多可以扩展一个其他类。
但是,您可以让您的枚举类实现一个接口(interface)。
来自 this Java tutorial on Enum Types :
Note: All enums implicitly extend java.lang.Enum. Because a class can only extend one parent (see Declaring Classes), the Java language does not support multiple inheritance of state (see Multiple Inheritance of State, Implementation, and Type), and therefore an enum cannot extend anything else.
为 Java 8 编辑:
从 Java 8 开始,接口(interface)可以包含 default methods .这允许您在接口(interface)中包含方法实现(但不包括状态)。尽管此功能的主要目的是允许公共(public)接口(interface)的演变,但您可以使用它来继承自定义方法,定义多个枚举类之间的公共(public)行为。
但是,这可能很脆弱。如果稍后将具有相同签名的方法添加到 java.lang.Enum类,它将覆盖您的默认方法。 (当一个方法同时在类的父类(super class)和接口(interface)中定义时,类实现总是胜出。)
例如:
interface IFoo {
public default String name() {
return "foo";
}
}
enum MyEnum implements IFoo {
A, B, C
}
System.out.println( MyEnum.A.name() ); // Prints "A", not "foo" - superclass Enum wins
关于java - 如何从抽象类扩展枚举类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15450897/
我是一名优秀的程序员,十分优秀!