2010-01-13 8 views
9

Czy jest lepszy sposób na zrobienie tego?Pochodząca klasa przypadku Scala z tymi samymi zmiennymi składowymi jak baza

scala> case class A(x : Int) 
defined class A 

scala> case class B(override val x : Int, y : Int) extends A(x) 
defined class B 

Rozszerzam A o B i dodam dodatkową zmienną składową. Byłoby miło nie pisać override val przed x.

+0

Ten przykład wygląda jak mam być trochę wybredny ale jeśli klasa bazowa ma wiele zmiennych składowych wszystkich 'def's nadpisywania zacząć dodać. – Dave

+0

Cóż, o ile mi wiadomo, klasy przypadków działają tak. – F0RR

Odpowiedz

14

Zdecydowanie odradzam dziedziczenie z klasy przypadków. Ma zaskakujący wpływ na equals i hashCode i został wycofany w Scala 2.8.

Zamiast tego zdefiniuj x w klasie rysunkowej lub abstrakcyjnej.

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

scala> case class B(val x: Int, y: Int) extends A 
defined class B 

http://www.scala-lang.org/node/3289

http://www.scala-lang.org/node/1582

+0

Na 2.8 nie widzę nic dziwnego w odniesieniu do equals/hashCode. Wszystkie wymagane właściwości równań są utrzymywane w najbardziej intuicyjny sposób. (Instancje z typem środowiska wykonawczego 'case case A' nigdy nie są równe instancjom' case case B', niezależnie od tego, czy w grę wchodzi dziedziczenie). –

+12

Precyzyjnie, klasy przypadków nie powinny dziedziczyć z innych klas przypadków. Jest w porządku (i dość często), aby normalna klasa dziedziczyła po klasie sprawy. –

+0

Oznacza to, że jeśli piszesz klasy spraw, skutecznie zamykasz te klasy. To efekt uboczny, którego bym się nie spodziewał, ale będę ostrożny w przyszłości. – Dave

Powiązane problemy