假设您有一个类Foo,它是某种文本文件的抽象,以及一个带有工厂方法的伴随对象,可以简化Foo的创建:
class Foo(val lines : Seq[String], filePath : String) { ... }
object Foo {
def apply(file : File) : Foo = { new Foo(scala.io.Source.fromFile(file, "ISO-8859-1").mkString.split("\n").toList, file.getPath }
def apply(file : String) : Foo = { apply(new File(file) }
}
如果要将Foo
扩展为Bar
和Baz
,如果两个子类都需要具有相同的工厂方法,会发生什么?您不想将配套对象Foo
复制为配套对象Bar
和配套对象Baz
,那么制作工厂方法的正确方法是什么?#34; generic& #34;
答案 0 :(得分:1)
您可以执行以下操作:
trait FooFactory[T <: Foo] {
def apply(file : File) : T = //to be implement in your Baz and Bar class
def apply(file : String) : T = { apply(new File(file) } //shared method, no need to implement in subclassing classes
}
//example for Bar implementation------------------------------
class Bar extends Foo {
// any specific Bar code here
}
object Bar extends FooFactory[Bar] {
def apply(file : File) : Bar = { new Bar(scala.io.Source.fromFile(file, "ISO-8859-1").mkString.split("\n").toList, file.getPath }
}