我想在特征中创建一个返回特征副本的方法,如下所示:
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最常用的处理方式?
答案 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)