繁体   English   中英

Scala 3 枚举方法覆盖

[英]Scala 3 enum method override

有没有办法像 Java 一样覆盖 Scala 3 枚举中的方法?

public enum Test {

    ONE {
        @Override
        public int calc() {
            return 1;
        }
    },
    TWO {
        @Override
        public int calc() {
            return 2;
        }
    };

    public abstract int calc();
}

我试过这样的事情,但没有结果。 也没有在文档中找到任何关于枚举方法覆盖的信息。

enum Test {
  def calc(): Int ={
    0
  }
  case One
    override def calc(): Int ={
      1
    }
  case Two
    override def calc(): Int ={
      2
    }
}

也许还有另一种方法可以实现类似的功能?

enum是密封的,因此事后无法扩展,因此没有理由override任何内容。 只需将所有案例收集在一个地方,而不是多个override方法,而是编写一个涵盖所有案例的单一方法:

enum A:
  case X(x: Int)
  case Y(y: String)
  def foo: String = this match {
    case X(x) => s"X = ${x}"
    case Y(y) => y
  }

val x = new A.X(42)
val y = new A.Y("y")
println(x.foo) // X = 42
println(y.foo) // y

看来你想要的目前是不可能的,但还有其他方法可以做到。 您可以尝试使用覆盖calc的对象的老式密封特征。

sealed trait Test:
  def calc: Int
object One extends Test:
  def calc = 1
object Two extends Test:
  def calc = 2

function calc也可以作为Test的参数,尽管我不太喜欢这种方法。

enum Test(calc: () => Int):
  case One extends Test(() => 1)
  case Two extends Test(() => 2)

另一种方法是通过单一方法和模式匹配,就像 gianluca aguzzi 和 Andrey Tyukin 所做的那样,尽管不需要扩展方法。

如果calc必须是 function,我会建议第一种方法,或者如果您觉得它更适合您,则建议使用模式匹配。 如果您想覆盖多个方法,密封特征也是一个不错的选择,因为您不需要单独进行模式匹配或将一堆 lambdas 集中到构造函数调用中。 如果不是 function,我觉得第二个效果最好。

在 scala 3 中,将enumextension method结合可以达到类似的结果:

enum Test {
  case One, Two
}

extension (test: Test)
  def calc() : Int = test match {
    case Test.One => 1
    case Test.Two => 2
  }

我希望我对你有帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM