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

あなたはそれを後ろから見ています。オブジェクトが作成されると、そのコンストラクターが呼び出されます。これは、デフォルトまたは明示的な呼び出しによって、そのスーパークラスのコンストラクターに委譲します。最初にスーパークラスのコンストラクターを呼び出したのはサブクラスのコンストラクターであるため、スーパークラスのコンストラクターからサブクラスのコンストラクターを呼び出すことはできません。

ロジックを見て、サブクラスが認識される方法は、それが直接インスタンス化されているということを覚えておく必要があります。スーパークラスが何らかのパラメーターとしてサブクラスを使用してインスタンス化されているのではなく、サブクラスをインスタンス化するステップとしてスーパークラスがインスタンス化され、スーパークラスはそれ自体の構造についてのみ知っている必要があり、サブクラスの詳細はトリガーされたサブクラス コンストラクターに任せます。スーパークラス。

于 2012-05-05T03:14:51.117 に答える