0

型で再帰的な特性でメソッドを記述しようとしていますが、コンパイラが自分のしていることを知っていると確信できるような方法で基本ケースを記述できないという問題に直面しています。

要点は次のとおりです。

trait InheritableBehavior {
  def superClassWithInheritableBehavior: Option[Class[_]] = {
    // reflection and magic (from some library's code)
  }

  def doSomething() {
    if (this.superClassWithInheritableBehavior.isDefined) {
      super.doSomething()
    } else {
      // base case here, which relies on local fields
    }
  }
}

コンパイラは でマークdoSomething()することを提案してabstract overrideいますが、具体的な実装はありません。すべてがその1つの方法にあります。

トレイトを 2-- に分割できると思いますがBaseInheritableTrait、これは を呼び出さず、呼び出しsuperDerivedInheritableTrait含みますがsuper、これに対処するより良い方法はありますか?

できるようになりたいのですがsuper.asInstanceOf[InheritableTrait].doSomething()、それは不可能のようです。

4

1 に答える 1

1

私たちが何をしているのかわからないと確信している場合、コンパイラは正しい場合があります。

「具体的な実装がない」というのが何を意味するのかわかりません。

通常、abstract override具体的な実装を持つクラスと混在することを意味します。そうでなければ、呼び出すものは何もありません。

おそらく、「InheritableTrait を使用するクラスがあり、それを拡張して InheritableTrait を再度ミックスしたい」という意味かもしれません。しかし、実際には、それはできません。ミックスインは一度線形化されます。

最近の質問に素晴らしい回答がありました。それを見つけようと思います。そして、これをだまされたとマークできるかもしれません。

更新:これは、質問への回答または改善に役立つ可能性のある同様の最近の質問です。率直に言って、私は愛を受けていないが楽しいコードを含む他の回答を好みますが、それには細かく徹底的な回答が含まれています。

考慮:

これに対処するより良い方法はありますか?

たぶん、あなたが探しているのは、ここで自分が何かと混ざっていることを指定したい自己型です:

trait Me { _: Konkret =>
  def run() = concrete()
}

たぶん、さまざまな種類がKonkretあり、何をすべきかを反射的に決定したいですか?

または、単にテンプレート メソッドが必要な場合もあります。

trait Me {
  def doSomething(): Unit
  def run() = doSomething()
}
于 2013-07-14T19:37:46.060 に答える