从祖先创建sublass实例

Tom*_*asz 0 scala

我在Scala中很陌生。具有名为“ Document”的类和一些作为Document子级的类,例如“ Doc1”和“ Doc2”。所以:

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
}
Run Code Online (Sandbox Code Playgroud)

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

任何想法欢迎。

Gal*_*aor 8

最佳做法是使用伴随对象/单个对象

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

及其用法:

val document1 = Document("doc1")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于类似构造函数的方法,通常将方法命名为“ apply”,因此您可以在不提及方法名称的情况下编写“ Document(“ doc1”)`。 (2认同)
  • 您的代码有错别字,实际上并没有执行要求的操作。`document1`是什么类型?是_not_`Doc1`。为了访问`Doc1`方法,必须将其强制转换为`Doc1`。 (2认同)
  • 对。_concrete_类型是Doc1,但不是Doc1。强制将其转换为.asInstanceOf [Doc1]`,但这不是我在_my_代码中接受的做法。 (2认同)