从祖先创建sublass实例

时间:2019-06-04 07:02:24

标签: scala

我在Scala中很陌生。有一个名为“ Document”的类,还有一些类,例如“ Doc1”和“ Doc2”,它们都是Document的子级。所以:

abstract class Document(id: Int, xmlString: String) {
// make some operations and create an instance of subtype
}
case class Doc1 extends Document {
// some subclass specific methods
}
case class Doc2 extends Document {
// some subclass specific methods
}

要运行Document构造函数,并由于传递的参数而有条件地创建Doc1或Doc2实例。我应该在“文档”类中添加一些辅助构造函数吗?

欢迎提出任何想法。

1 个答案:

答案 0 :(得分:8)

最佳做法是使用companion object/singleton object

abstract class Document { ... }
object Document {
  def apply(docType: String) = {
     if (docType == "doc1") {
         Doc1()
     } else {
         Doc2()
     }
  }
}

及其用法:

val document1 = Document("doc1")

当然,这只是一个简单的示例-您可以将docType更改为密封类,并通过模式匹配来检查类型。

  • 更新-通过@ crater2150注释-您可以使用apply代替不同的函数名称,因此您将编写Document("doc1")而不是Document.someFunctionName("doc1")