我正在使用具有密封特性的库。 我真的需要扩展这个特性。
有没有办法(甚至是肮脏的)绕过那个?
对于一些背景知识,我正在努力解决这个问题:https://github.com/ReactiveMongo/ReactiveMongo/issues/247
答案 0 :(得分:3)
不要扩展,包括,如果您需要考虑其他选项。
// 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
可以通过隐式转换来减少样板
implicit def fooToBar(foo: Foo): Bar = BarFoo(foo)
或如果要将新方法添加到现有类,请使用隐式类:
// 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
}
}
然后,您可以对.quux
值使用Foo
:
scala> Foo1(2).quux
res1: Boolean = false
scala> Foo2("").quux
res2: Boolean = true
这与扩展大致相同,但与样板相比更少:
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