当前位置: 首页 > 面试题库 >

如何从抽象类扩展枚举类?

怀德馨
2023-03-14
问题内容

有这样的事情:

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 >报纸中,该报纸确实扩