2016-10-21 1 views
0

私は、1つの抽象メソッドといくつかの具体的なメソッドを持つの特性を定義しました。その多くはいくつかの変更を加えた新しいオブジェクトインスタンスを作成します。私は今、それぞれの具体的なメソッドの戻り値の型を変更することなく、Super[A]から継承するいくつかのクラスを構築したいと思いますScalaタイプのシグネチャをサブクラスに拡張するには?

trait Super[A] { self => 

    def abstractMethod: A 

    def map[B](f: A => B): Super[B] = new Super[B] { 
    def abstractMethod = f(self.get) 
    } 
} 

:これは一例です。

このような結果を得るために最も慣れ親しんだ方法は何ですか?

+0

を期待通りにしたい場合は、私はカップルのクラス

class X(val n: Int) extends Super[X] { def abstractMethod = this def toY = new Y(n) } class Y(val n: Int) extends Super[Y] { def abstractMethod = this def toX = new X(n) } 

作品

代わりに.MAPに
trait Super[A] { self => def abstractMethod: A def map[B](f: A => B) = new Super[B] { def abstractMethod = f(self.abstractMethod) } } 

を.abstractMethodを使用しそのように定義されていませんでしたいくつかの具体的な型 'A'の実装では、いくつかのジェネリックの実装が必要な場合、' class Impl extends Super [String] 'を実行できます'A'をタイプすると、' class Impl [A] extends String [A] 'を行うことができます。私はあなたが取り組んでいる作業の全てを知らないが、代わりにタイプメガネを考えるかもしれない。 –

+0

なぜあなたは戻り値の型を変更したいのですか?各具体的なメソッドの戻り値の型を変更する必要がある 'Super [A]'から継承したクラスの例を表示できますか? – TeWu

+0

'Super'インスタンスではなく、具象クラスのインスタンスを返すための具体的なメソッドが必要です –

答えて

0

あなたは具体的なメソッドの戻り値の型を変更したくないと言うので、この例ではマップします...戻り値の型を変更する必要はありません。簡単な例。

注:に.getは

val x: X = new X(999) 
val y: Y = x.map(_.toY).abstractMethod 
val x2: X = y.map(_.toX).abstractMethod 

val sup_x: Super[X] =  x.map(_.abstractMethod) 
val sup_y: Super[Y] =  x.map(_.toY) 
val sup_y2: Super[Y] = sup_x.map(_.toY) 
val sup_x2: Super[X] = sup_y.map(_.toX) 
関連する問題