2017-01-11 4 views
0

私はそうのような特性があるとします。メンバオブジェクトからdefを公開していますか?

trait A { 
    def x: Long 
    def y: Long 
} 

を私はAを取り、Aにする必要があるクラスを持っている:

case class B(a: A, foo: Foo, bar: Bar) extends A { 
    override def x = a.x 
    override def y = a.y 
} 

Aは、メンバーの多くを持っていた場合、これはなるだろうすぐに迷惑をかける。フーとバーでAを「飾る」パターンがありますか?

+0

これはのことを思い出しますhttp://stackoverflow.com/questions/25893462/delegate-interface-implementation-to-a-ember – Suma

+1

なぜ「B」が「A」になる必要があるのか​​を詳しく説明できますか? 'A'として動作するか、' A'への変換で十分でしょうか? – Suma

+0

私はBがAと振る舞い、暗黙の変換の解法が働くことが判明しました!ありがとう。 –

答えて

0

私はそれはあなたのための任意の使用であろう場合、私は知らない、そのようなコードを思い付いた:

object SelfAnnotationExample extends App{ 

    trait A { 
    def x: Lon 
    def y: Long 
    } 

    trait ExtendedA extends A { self: InstanceProvider[A] => 
    def x: Long = self.instance.x 
    def y: Long = self.instance.y 
    } 

    trait InstanceProvider[A] { 
    def instance: A 
    } 

    case class B(instance: A, foo: Any) extends ExtendedA with InstanceProvider[A] 
    case class TestA(x: Long, y: Long) extends A 

    val test = B(TestA(3, 4), 23) 
    println(test.x) 
    println(test.y) 
} 

私は「自己の種類」として知られているScalaの機能を使用し、私が名付けた場合(誰かが私を修正それは間違っている)。 Trait InstanceProviderはこの特定のケースに限定されません。この解決策は、追加の特性ExtendedA定義を必要とするが、Aのすべての具体的な実装はそれを利用することができる。

+0

私は 'ExtendedA'はOPが避けたかったものだと思います。それぞれのメンバーを 'A'で繰り返すことです。 – Suma

0

あなたはBAからメンバーを呼び出すとAを期待関数にBA一部を通過したいしたい場合は、BからAへの暗黙的な変換を使用してそれを達成することができます

import scala.language.implicitConversions 

object Main extends App{ 

    trait A { 
    def x: Long 
    def y: Long 
    } 

    def processA(a: A) =() 


    class Foo 
    class Bar 
    case class B(a: A, foo: Foo, bar: Bar) 

    implicit def bToA(b: B): A = b.a 

    case class TestA(x: Long, y: Long) extends A 

    val test = B(TestA(3, 4), new Foo, new Bar) 
    println(test.x) 
    println(test.y) 
    processA(test) 
} 
関連する問題