覆盖 Scala 中的密封特征

tib*_*ibo 2 overriding scala traits

我正在使用具有密封特性的库。我真的需要扩展这个特性。

有没有办法(甚至是肮脏的)绕过它?

对于一些背景,这就是我想要解决的问题:https : //github.com/ReactiveMongo/ReactiveMongo/issues/247

pha*_*dej 5

不要扩展,包括,如果您需要考虑另一种选择。

// Foo.scala
sealed trait Foo
case class Foo1(n: Int) extends Foo
case class Foo2(s: String) extends Foo

// Bar.scala
sealed trait Bar
case class BarFoo(foo: Foo) extends Bar
case class Bar3(b: Boolean) extends Bar
Run Code Online (Sandbox Code Playgroud)

并且可以通过隐式转换减少样板

implicit def fooToBar(foo: Foo): Bar = BarFoo(foo)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想向现有类添加新方法,请使用隐式类:

// Foo.scala
sealed trait Foo
case class Foo1(n: Int) extends Foo
case class Foo2(s: String) extends Foo

// Quux.scala
// This class be called FooOps or FooExtra, if you like, name is irrelevant
implicit class Quux(foo: Foo) {
  def quux: Boolean = foo match {
    case Foo1(n) => n == 0
    case Foo2(s) => s.isEmpty
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用.quuxFoo值:

scala> Foo1(2).quux
res1: Boolean = false

scala> Foo2("").quux
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)

这与扩展大致相同,但样板更少,比较:

case class Quux2(foo: Foo) {
  def quux2: Boolean = foo match {
    case Foo1(n) => n == 0
    case Foo2(s) => s.isEmpty
  }
}

implicit def fooToQuux2(foo: Foo): Quux2 = Quux2(foo)

scala> Foo1(2).quux
res0: Boolean = false

scala> Foo2("").quux
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)