有这样的事情:
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
。例如add- 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
该类,以便可以使用与in
Major
中相同的切换方法Base
?我想知道的是,有没有一个更好的设计,第二个是是否必须为之创建新的Token类,Major
或者是否可以扩展或重用现有的Token
。
编辑:概念要点是Base
让我可以轻松地在处理各种类型输入的不同项目中重用该类。
所有枚举都隐式扩展Enum。在Java中,一个类最多可以扩展一个其他类。
但是,您可以让您的枚举类 实现interface 。
在有关Enum
Types的Java教程中
:
注意:所有枚举都隐式扩展java.lang.Enum。由于类只能扩展一个父类(请参见声明类),因此Java语言不支持状态的多重继承(请参见状态,实现和类型的多重继承),因此枚举不能扩展任何其他内容。
针对Java 8编辑:
从Java
8开始,接口可以包含默认方法。这使您可以在接口中包括方法实现(但不能包括状态)。尽管此功能的主要目的是允许公共接口的演变,但是您可以使用它继承自定义方法,该方法定义多个枚举类之间的常见行为。
但是,这可能很脆弱。如果稍后将具有相同签名的方法添加到java.lang.Enum类,它将覆盖默认方法。(当在类的超类和接口中都定义了一个方法时,该类的实现将始终获胜。)
例如:
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
问题内容: 我有一个枚举,我们称它为A: 我有一个需要枚举A的函数: 如何创建另一个枚举,可能调用B并传递给 functionA ?像这样吗 我知道您无法扩展枚举,但是我还有哪些其他选择?实现此目标的最佳方法是什么? 问题答案: 你不能 枚举类型在设计上是最终的。 原因是每个枚举类型都应 仅 具有 在枚举中声明的元素 (例如,我们可以在switch语句中使用它们),如果允许扩展类型,则不可能。 您
本文向大家介绍C#扩展抽象基类,包括了C#扩展抽象基类的使用技巧和注意事项,需要的朋友参考一下 示例 与接口(可以描述为实现合同)不同,抽象类充当扩展的合同。 抽象类无法实例化,必须对其进行扩展,然后可以实例化生成的类(或派生类)。 抽象类用于提供通用实现 上面的示例显示了实现Car的任何扩展类如何自动接收HonkHorn方法。这意味着任何开发新汽车的开发人员都无需担心它将如何鸣笛。
问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚
问题内容: 我之前了解到抽象类可以扩展具体类。尽管我没从JAVA设计师那里看到原因,但是没关系。我还了解到,扩展具体类的抽象类可以使重写的方法抽象。为什么?您可以提供有用的用例吗?我正在尝试学习设计模式,我不想错过任何东西。 这是示例: 问题答案: 如果我有一组想要默认实现的类(以便它们可以从扩展),并且想要强制提供自己的实现(在这种情况下使其抽象为子类会强制执行此操作。) 当然,此示例中的另一种
问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S
我正在用Java构建一个库管理应用程序。 我有一个名为 的抽象类。它有一个称为 的抽象方法。 有一个名为< code>Newspaper的子类,它当然实现了< code>equals,其签名与< code>equals在< code>Material中的签名完全相同: Java无法解析< code > elementoacomparer 的任何方法。它们都存在于< code >报纸中,该报纸确实扩