Предположим, у меня есть класс case, определенный следующим образом:
case class User(name: String, age: Int)
Я бы хотел переопределить его toString
метод следующим образом:
case class User(name: String, age: Int) {
override def toString: String =
s"name = $name
age = $age"
Так что если я запусту print(user.toString)
, я получаю:
name = nameOfUser
age = ageOfUser
Теперь у меня есть другой класс с именем Computer
, и он определен как
case class Computer(make: String, RAM: int, clockSpeed: Double)
Я хотел бы напечатать один и тот же для всех его значений.Я хотел бы что-то вроде:
make = makeOfComputer
RAM = RAMOfComputer
clockSpeed = speedOfComputer
Вместо того, чтобы копировать, вставлять и адаптировать вышеуказанную функцию toString
к классу Computer
, я бы предпочел абстрагировать это так, чтобы она могла использоваться любымcase case.
У меня есть несколько идей: я могу использовать
CaseClassType.unapply(caseClassInstance).get.productIterator.toList
, чтобы получить значения класса case, и
classOf[CaseClass].getDeclaredFields.map(_.getName)
, чтобы получить именаполя.Это означает, что я могу найти список всех значений в классе case, а также список всех имен полей, даже не зная фактической структуры класса case.
Когда у меня есть эти две коллекции, я могу рекурсивно просмотреть их, чтобы создать строку.Я думал, что что-то вроде приведенного ниже может работать, но, к сожалению, scala не позволяет классам case наследовать от других классов case.
case class StringifiableCaseClass(){
override def toString: String =
//get the values and the fieldnames and create a string
Все, что мне нужно сделать, это заставить классы case расширяться StringifiableCaseClass
и они смогут создать правильную строку.
Причина, по которой я хочу использовать класс case в качестве базового типа, заключается в том, что я могу использовать
classOf[this.type]...etc
и
this.type.unapply(this)...etc
в StringifiableCaseClass
.
Любые идеи о том, как я могу достичь того, что я имею, после того, как я не могу расширить классы случаев с другими классами случаев?