2

共通のスーパークラスを拡張するいくつかのケース クラスがあり、メソッドを使用してスーパークラスからフィールドにアクセスしたいと考えていますproductElement(ベース クラスをケース クラスとして宣言しようとしましたが、ケース クラスの継承の危険性について恐ろしい警告が表示されます。それでも機能しません)。

次のような解決策を想像できます。

abstract class A(a: Int) extends Product {
  def productArity = 1
  def productElement(n: Int) = if (n == 0) a else throw new IndexOutOfBoundsException
}

case class B(b: Int) extends A(1) {
  def productArity = super.productArity + 1  
  def productElement(n: Int) = if (n < super.productArity) super.productElement(n) else ....
}

しかし、あまりにも醜いので、終わらせることさえできませんでした。

誰もがより良い解決策を知っていますか?

4

2 に答える 2

4

Scala トランクでは、これの多くが既に行われています: ケース クラスは適切な ProductN トレイトを拡張するようになりました。ただし、ケース クラスの直接の (つまり、継承されていない) メンバーのみが製品に含まれているため、スーパー タイプのメンバーを含める必要がある場合は、スーパー タイプで抽象化し、ケース クラスで具象実装を指定する必要があります。

REPL セッション (Scala トランク、2.10.0.r25951-b20111107020214) は次のとおりです。

scala> trait A { val a: Int }
defined trait A

scala> case class B(b: Int, a : Int = 1) extends A                                                                                                                                                     
defined class B                                                                                                                                                                                        

scala> val b = B(23)
b: B = B(23,1)                                                                                                                                                                                         

scala> b.productArity
res0: Int = 2                                                                                                                                                                                          

scala> b.productElement(0)
res1: Any = 23                                                                                                                                                                                         

scala> b.productElement(1)
res2: Any = 1                                                                                                                                                                                          

scala> b._1      // use Product method ... note result type
res6: Int = 23                                                                                                                                                                                         

scala> b._2      // use Product method ... note result type                                                                                                                                                                                            
res7: Int = 1
于 2011-11-07T10:07:12.050 に答える
1

私が得ることができる最も近いのは、Aに何も実装しないことです

scala> abstract class A(val a: Int) extends Product
defined class A

scala> case class B(override val a: Int, b: String) extends A(a)
defined class B

scala> val anA: A = B(42, "banana")
anA: A = B(42,banana)

scala> anA.a
res37: Int = 42

scala> anA.productArity
res38: Int = 2

scala> anA.productElement(1)
res39: Any = banana

scala> anA.productElement(0)
res40: Any = 42
于 2011-10-31T18:34:40.960 に答える