2016-05-13 3 views
1

Что я пробовал:Как я могу реализовать класс case с несколькими отдельными общими интерфейсами?

object LolTest { 
    trait Foo { 
     def foo: Int // getter 
     def foo(i: Int): Foo // setter 
    } 

    trait Bar { 
     def bar: String // getter 
     def bar(s: String): Bar // setter 
    } 

    case class Buzz(foo: Int, bar: String) extends Foo with Bar { 
     override def foo(i: Int): Buzz = copy(foo = i) 
     override def bar(s: String): Buzz = copy(bar = s) 
    } 
} 

Но мой реальный класс должен иметь много полей (около 10). И необходимость реализовать сеттеры (обновления, трансформаторы?) В конкретном классе вместо черт выглядит ... неправильно. И у меня все больше и больше проблем, пытаясь добавить к классу разные настройки.

Буду признателен за эту проблему.

+2

Почему бы просто не использовать класс случая с того, что десятью полями? https://github.com/alexandru/scala-best-practices/blob/master/sections/2-language-rules.md#24-should-not-define-useless-traits – leshkin

+0

@leshkin: чтобы инкапсулировать разные "виды «класса от разных пользователей. «Программа для интерфейса» и все такое. –

ответ

1

Возможно, вы не хотите внедрять «сеттеры» для классов вашего случая. Я хотел бы сделать это следующим образом:

scala> case class A(a: Int, b: String = "hi", c: Boolean = false) 
defined class A 

scala> A(1) 
res0: A = A(1,hi,false) 

scala> A(1, "bye") 
res1: A = A(1,bye,false) 

scala> A(1, "bye", true) 
res2: A = A(1,bye,true) 

scala> res2.copy(b = "actually hi") 
res3: A = A(1,actually hi,true) 

В этом примере a требуется. Если вы хотите пример, где можно построить A только с указанием b, дать значение по умолчанию для a в вашем случае определения класса:

scala> case class A(a: Int = 1, b: String = "hi", c: Boolean = false) 
defined class A 

scala> A(b = "only change the middle") 
res9: A = A(1,only change the middle,false) 
Смежные вопросы