Наследование товара в тематических классах - PullRequest
2 голосов
/ 31 октября 2011

У меня есть некоторые классы дел, которые расширяют общий суперкласс, и я хотел бы получить доступ к полям из суперкласса, используя метод productElement (я пытался объявить базовый класс как класс дел, но я получил пугающее предупреждениеопасности наследования классов case, и все же это не работает).

Кто-нибудь знает лучшее решение?

Ответы [ 2 ]

4 голосов
/ 07 ноября 2011

В магистрали Scala многое из этого уже сделано для вас: классы дел теперь расширяют соответствующую характеристику ProductN. Однако в продукт включены только прямые члены класса case (т.е. не наследуемые), поэтому, если вам нужно включить члены из супертипа, они должны быть абстрактными в супертипе и иметь конкретную реализацию в классе case.

Вот сеанс 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
1 голос
/ 31 октября 2011

Самое близкое, что я могу получить - это не реализовывать что-либо в 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
...