0

我想从超类 ( ) 调用子类的构造函数来创建类型(或)Tree[A]的子类的其他实例。似乎必须有一种方法比创建中间方法的混乱更好,因为工作之类的事情。我听说 CanBuildFrom 可能会解决这个问题。APartProjectnewChildList

从工作代码中提取:

abstract class Tree[A](parent: Option[A], key: Int) {
  protected def newChild(aKey: Int): A
  lazy val children: List[A] = childrenOf.map(newChild(_))
  ...
  }

case class Part(parent: Option[Part], key: Int) extends Tree[Part](parent, key) {
  protected def newChild(aKey: Int) = Part(Some(this), aKey)
  ...
  }

case class Project(parent: Option[Project], key: Int) extends Tree[Project](parent, key) {
  protected def newChild(aKey: Int) = Project(Some(this), aKey)
  ...
  }
...
"*" #> <ul>{Part(None, pKey).expandAsHtml}</ul>

为超类中的成员使用 Scala 子类构造函数的更好方法是什么?

4

2 回答 2

1

你倒着看。当一个对象被创建时,它的构造函数被调用;this 默认或通过显式调用委托给其超类的构造函数。您不能从超类的构造函数中调用子类的构造函数,因为首先是子类的构造函数调用了超类的构造函数。

您需要查看您的逻辑并记住子类的已知方式是直接实例化它;并不是说超类是用子类作为某种参数来实例化的,而是超类被实例化作为实例化子类的一个步骤,并且超类应该只知道自己的结构,将子类细节留给触发的子类构造函数超类。

于 2012-05-05T03:14:51.117 回答
0

据我所知,实现这一目标的唯一方法是使用反射。

我在这里找到了一个教程:http ://www.heimetli.ch/java/create-new-instance.html

这样,您可以在超类中获取子类的构造函数并调用它来创建子类的新实例。

但是,您必须以某种方式确保您的子类实现具有特定参数列表的构造函数。

于 2016-06-30T10:02:00.990 回答