我的Scala代码中有以下模式:
class A(x: Int)
object A {
def apply(x: Int, y: Int) = new A(x + y)
}
class B(x: Int) extends A(x)
object B {
def apply(x: Int, y: Int) = new B(x + y)
}
apply方法完全相同,除了它们构造的对象的Class。我想避免这种代码重复,特别是因为在我的实际代码中我有几种应用方法并且它们更长。
我怎样才能做到这一点?如何删除此代码重复?
我想到了这样的事情:
class A(x: Int)
class B(x: Int) extends A(x)
trait C[T <: A] {
def apply(x: Int, y: Int) = new T(x + y)
}
object A extends C[A]
object B extends C[B]
它不起作用,因为T不是一个类,因此我做不到&#34;新的T(x + y)&#34;。
答案 0 :(得分:3)
在特定情况下,您可以执行类似
的操作class A(x: Int) {
def this(x: Int, y: Int) = this(x + y)
}
class B(x: Int) extends A(x)
答案 1 :(得分:2)
class Adder[T](f: Int => T) {
def apply(x: Int, y: Int) = f(x + y)
}
class A(x: Int)
object A extends Adder(new A(_))
class B(x: Int) extends A(x)
object B extends Adder(new B(_))
答案 2 :(得分:1)
我会提出这个解决方案:
class A(x: Int)
class B(x: Int) extends A(x)
trait C[+T <: A] {
def apply(x: Int, y: Int) = create(x + y)
protected def create(x: Int): T
}
object A extends C[A] {
override protected def create(x: Int) = new A(x)
}
object B extends C[B] {
override protected def create(x: Int) = new B(x)
}
看看GenericCompanion
课程。它是Scala集合库的一部分,可能会激发您的灵感:
http://www.scala-lang.org/api/current/index.html#scala.collection.generic.GenericCompanion