1

関数を取り込むクラスを作成しようとしていますが、これはオプションにしたいので、呼び出し元がそれを省略した場合は、デフォルトの関数に置き換えたいと思います。

現在、私は次のものを持っています:

class MenuItem(val text: String, val onClick: (Vector2f) => Unit) extends Renderable {
  def this(text: String) = this(text, { position => () })

  private def default(position: Vector2f) = {
    println(text + " was clicked, but is still using the default event.")
  }
}

{ position => () })これは正常に機能しますが、コンストラクターのをに置き換えたいのですが、defaultこれを行うと、「not found:valuedefault」というエラーが発生します。

プライベート修飾子なしでデフォルトを宣言しようとしましたが、これは役に立ちませんでした。

私が思いついた最善の解決策は、次のように宣言することでした。

def this(text: String) = this(text, position => println(text + " was clicked, but is still using the default event."))

デフォルトのメソッドを定義したままにしてその名前を使用する方法はありますか、それともメソッドをインラインで実装することに固執する必要がありますか?

4

1 に答える 1

4

これは機能するはずです(奇妙なタイプを削除してコンパイル可能にしました):

object MenuItem {
    def default(text: String, position: AnyRef) = {
        println(text + " was clicked, but is still using the default event.")
    }
}

class MenuItem(val text: String, val onClick: (AnyRef) => Unit) {
    def this(text: String) = this(text, MenuItem.default(text, _))
}

構築しようとしているオブジェクトのメソッドへのアクセスは、構築された後にのみアクセスできるため、機能しません。

言語仕様セクション5.3.1から:

コンストラクター定義のシグニチャーとセルフコンストラクター呼び出しは、包含クラス定義の時点で有効なスコープで型チェックおよび評価され、包含クラスの任意の型パラメーターおよび任意の初期定義によって拡張されます(§5.1 .6)同封のテンプレートの。

'自己コンストラクターの呼び出しは、プライマリコンストラクターの呼び出しです。また、囲んでいるクラスのスコープで型チェックされているため、クラス内のメソッドは表示されません。

textプライマリコンストラクターが呼び出される前に、インスタンスのフィールド(この場合)が定義されていないため、これは良いことです。

于 2012-10-03T17:33:30.607 に答える