在 Scala 中重用对象的应用函数
Reuse object's apply functions in Scala
我有一个 class A 和使用 apply 方法的工厂函数。
object A {
def apply(a:String) {... new A}
def apply(a:Int) {... new A}
...
}
class A(...) {
...
}
当我有一个来自 A 的具有相同工厂方法的子class B 时。我有生成 B 的相同应用方法。
object B {
def apply(a:String) {... new B} // duplication
def apply(a:Int) {... new B} // duplication
...
}
class B(...) extends A {
...
}
我可以在 B 中重用 A 中的应用方法吗?
实现此目的的一种方法是定义一个包含常用方法的混合特征,这将取决于抽象工厂函数。然后,伴随对象可以扩展这样的mixin,只实现创建相应实例的具体方法。
一个例子:
trait FooFactory[T] {
def make(s:String, i:Int): T
def apply(s:String):T = make(s, 0)
def apply(i:Int):T = make("", i)
}
class A(s:String = "", i:Int = 0) {
def foo:String = s+i
override def toString() :String = s"[$foo]"
}
// object A {
// def apply(a:String): A = { new A(s=a)}
// def apply(a:Int): A = { new A(i=a)}
// }
object A extends FooFactory[A] {
def make(s:String, i:Int) = new A(s,i)
}
class B(s:String = "") extends A(s,-1){
override def foo:String = s+":"+super.foo
}
// object B {
// def apply(a:String):B = { new B(a)}
// def apply(a:Int):B = { new B(a.toString)}
// }
object B extends FooFactory[B] {
def make(s:String, i:Int) = new B(s)
}
如果您需要访问目标 class 层次结构的特定方法,您可以将类型限制为其子类型的 class。
trait FooFactory[T <: A] {
def make(s:String, i:Int): T
def apply(s:String): T = make(s, 0).someAMethod()
}