trait with method返回trait的副本

时间:2017-12-24 19:33:20

标签: scala

我想在特征中创建一个返回特征副本的方法,如下所示:

sealed trait thing {
  def attr1: String
  def attr2: String
  def paste(middle: String) : String = {
    return attr1 + middle + attr2;
  }
  //def new_thing(addOn: String) : thing = {
    // create new thing with addOn pasted to end of attr1 and attr2, but with other attributes preserved
 // }
}

case class objectA(
  attr1: String,
  attr2: String,
  attrA: String
) extends thing

case class objectB(
  attr1: String,
  attr2: String,
  attrB: String
) extends thing

object example {
  def main(args: Array[String]) = {
    val x = objectA("A", "B", "C")
    val y = x.new_thing("Z")
    // should return 'y: objectA = objectA(AZ, BZ, C)
  }
}

在case clase中创建一个直接执行此操作的方法。

case clase objectA(
  attr1: String
  attr2: String
  attrA: String

) extends thing {
    def new_thing(addOn: String) : objectA = {
      return objectA(attr1 + addOn, attr2 + addOn, attrA)
    }
}

但是由于密封的特征有一个复制方法(编辑不,他们没有)我觉得我不应该为每个案例类实现new_thing

我正在学习Scala,所以有可能我错过了一些明显的东西。这是我想使用F-bounded多态的情况吗?什么是Scala最常用的处理方式?

1 个答案:

答案 0 :(得分:4)

我要做的是同样定义特征(不鼓励使用return):

sealed trait thing {
  def attr1: String
  def attr2: String
  def paste(middle: String): String = attr1 + middle + attr2
  def new_thing(addOn: String): thing
}

然后,对于每个案例类,我只是用我正在寻找的实现覆盖new_thing

case class objectA(attr1: String, attr2: String, attrA: String) extends thing {
  override def new_thing(addOn: String): objectA =
    objectA(attr1 + addOn, attr2 + addOn, attrA)
}

因此,您可以继续:

scala> val a: objectA = objectA("a", "b", "c")
a: objectA = objectA(a,b,c)

scala> val b: objectA = a.new_thing(" plus a")
b: objectA = objectA(a plus a,b plus a,c)

scala> b
res0: objectA = objectA(a plus a,b plus a,c)