2014-12-14 2 views
8

Класс корпуса Scala имеет функцию по умолчанию toString. Но когда класс case расширяет черту с существующей функцией toString(), она будет бесполезной. Как я могу предотвратить эту ситуацию?Как избежать переопределения функции toString класса case в Scala?

+0

Существует аналогичный вопрос по адресу: http://stackoverflow.com/questions/20998866/scala-prevent-mixing-methods –

ответ

19

ОК здесь является Самым лёгким ответ:

override def toString = ScalaRunTime._toString(this) 

конец истории :)

+0

Это СУХОЙ и легкий. –

+1

noob question: Это дало мне ошибки по нескольким причинам; Я получил это для работы: 'override def toString() = ScalaRunTime._toString (this)' (Мне пришлось добавлять parens после 'toString'). Более того, я должен был явно указать свой класс «продлить продукт». Любой способ избежать этого? (Кроме того, я использовал 'import scala.runtime.ScalaRunTime', чтобы избежать полного определения имени.) –

+2

@ not-just-yeti Объявление класса case эквивалентно расширению Product. Другие части связаны с быстрыми клавишами scala в разных версиях и не важны. – tribbloid

7

Вот обходное решение, которое, как я думаю, может работать, это может быть слишком много церемоний, вы решаете. Он включает trait.

trait StandardToString { this:Product => 
    override def toString = productPrefix + productIterator.mkString("(", ",", ")") 
} 

Сейчас пытается его с некоторыми образцами:

trait Human { 
    override def toString() = "Human" 
} 

case class European(firstName:String) extends Human 

и запуская его с чертой:

scala> new European("Falco") with StandardToString 
res0: European with StandardToString = European(Falco) 

конечно с trait вы остались с

scala> new European("Adele") 
res1: European = Human 
1

Это более точно сказать, что в случае класс toString не генерируется, а не что он отменяется.

Это не большой ответ или обходной путь.

scala> trait X { override def toString = "X" } 
defined trait X 

scala> case class Y(i: Int) extends X 
defined class Y 

scala> Y(42) 
res0: Y = X 

scala> case class Y(i: Int) 
defined class Y 

scala> class Z(x: Int) extends Y(x) with X { override def toString = super[Y].toString } 
defined class Z 

scala> new Z(42) 
res1: Z = Y(42) 

Вы не можете сделать это с помощью признака:

scala> trait R extends Y { override def toString = super[Y].toString } 
<console>:9: error: Implementation restriction: traits may not select fields or methods from super[C] where C is a class 
     trait R extends Y { override def toString = super[Y].toString } 
               ^
Смежные вопросы