如何"延伸"使用工厂方法使用伴随对象扩展类时的工厂方法

时间:2014-04-06 15:11:58

标签: scala factory-pattern companion-object

假设您有一个类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扩展为BarBaz,如果两个子类都需要具有相同的工厂方法,会发生什么?您不想将配套对象Foo复制为配套对象Bar和配套对象Baz,那么制作工厂方法的正确方法是什么?#34; generic& #34;

1 个答案:

答案 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 }
}