scala - 重写 Scala 中的密封特征

标签 scala overriding traits

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

有没有一种方法(即使是一种肮脏的方法)来绕过它?

对于一些背景知识,这就是我正在尝试解决的问题:https://github.com/ReactiveMongo/ReactiveMongo/issues/247

最佳答案

如果您需要考虑其他选择,请不要扩展,包括。

// 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
  }
}

然后您可以在 Foo 值上使用 .quux:

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

关于scala - 重写 Scala 中的密封特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27937731/

相关文章:

rust - "the method cannot be invoked on a trait object"在单独的特征实现上

scala - Apache Spark:将结果保存到数据库

scala - 值类中的验证

objective-c - 如何覆盖 webView 可以处理的重定向数量。 Obj-C, cocoa

syntax - 有什么方法可以创建特定 FnMut 的别名吗?

php - 交响乐 : is there a best practice about the directories' name including traits and interfaces?

scala - 如何从DataFrame中获取Array[Seq[String]]?

scala - 将Scala中的CSV读取到具有错误处理的案例类实例中

python - 是否可以在Python中重写namedtuple中的方法?

scala - 是否可以在 Scala 中重载构造函数?