2012-10-24 5 views
7

呼び出された同じクラスの型を常に返すメソッドを作る方法はありますか?これはScalaの型

私に説明してみましょう:

class Shape { 
    var mName: String = null 
    def named(name: String): Shape = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
    override def named(name: String): Rectangle = { 
    super.named(name) 
    this 
    } 
} 

これは動作しますが、私のサブクラスの全てにnamed関数をオーバーライドすることなく、これを行う方法はありますか?私は(動作しない)このような何かを探しています:

class Shape { 
    var mName: String = null 
    def named(name: String): classOf[this] = { // Does not work but would be great 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

任意のアイデア?それとも不可能なのでしょうか?

答えて

18

classOf[this]の代わりにthis.typeを使用する必要があります。

class Shape { 
    var mName: String = null 
    def named(name: String): this.type = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

それは(スカラ2.8に)機能することを実証する

scala> new Rectangle().named("foo") 
res0: Rectangle = [email protected] 

scala> res0.mName 
res1: String = foo 

this.typeclassOfを取得するために、実行時に呼び出される演算子でありながら、コンパイル型の型名ですjava.lang.Classオブジェクトです。パラメータは型名でなければならないので、classOf[this]はこれまで使用できません。 java.lang.Classオブジェクトを取得するときの2つのオプションは、classOf[TypeName]またはthis.getClass()を呼び出します。

+0

シングルトンタイプは 'this'以外のインスタンスには使用できないことに言及することは重要です。 – pedrofurla

+0

@pderofurla:パス依存型では可能であるはずですが、Scalaではパス依存型についてはほとんど分かりませんが、まだ実験中であるかどうかはわかりません。 –

+0

パス依存型とはまったく関係ないと思います。パス依存型は実験的ではありません。 – pedrofurla