Подтвердить что ты не робот

Scala объекты копирования

Есть ли способ сделать копию объекта (или даже лучше список объектов)? Я говорю о пользовательских объектах классов, которые могут быть расширены другими классами.

пример:

class Foo() {
   var test = "test"
}

class Bar() extends Foo {
   var dummy = new CustomClass()
}

var b = new Bar()
var bCopy = b.copy() // or something?
4b9b3361

Ответ 1

В Java они попытались решить эту проблему как метод clone, который работает при вызове clone во всех суперклассах, но это обычно считается сломанным и лучше всего устраняется по причинам, которые вы можете найти (например здесь).

Итак, в Scala, как genereally на Java, вам придется создать свой собственный метод копирования для произвольного класса, который позволит вам указать такие вещи, как глубокое или мелкое копирование полей.

Если вы сделаете класс a case class, вы получите бесплатный метод copy. Это действительно лучше, потому что вы можете обновлять любое из полей одновременно:

case class A(n: Int)
val a = A(1)         // a: A = A(1)
val b = a.copy(a.n)  // b: A = A(1) 
val c = a.copy(2)    // c: A = A(2)

Однако наследование классов case не рекомендуется.