/ / Класи справи Scala та успадкування - scala, спадкування, case-class

Класифікація випадків скала та спадкування - скала, спадщина, типовий клас

Мої знання трохи розмиті щодо класів справи Scala.

Я знаю, що класи case автоматично отримують такі функції, як appply і unapply а також перевірка рівності (я припускаю, що це equals метод)

Автоматична перевірка рівності, яка постачається з класом справи, не завжди є правильною для програми.

Моє запитання таке: якщо у мене є клас case, який розширює абстрактний клас, а абстрактний клас має свій equals(that:Any) перевизначений, чи буде case case успадковувати перевірку рівності, чи все одно це буде автоматична перевірка рівності?

Відповіді:

1 для відповіді № 1

Ви могли читати цей короткий розділ і вам навіть не знадобиться стільки часу, скільки потрібно написати кілька рядків коду, щоб спробувати.

Там сказано, що клас справи отримує копію, а також дорівнює, hashCode і toString, якщо один не успадкований або визначений. Останні повинні бути конкретними та визначеними деінде, ніж у AnyRef.

Це означає, що змішування в ознаці, яка оголошує рівне, не виключає рівне.

Тепер мені потрібно написати рядок коду, щоб підтвердити це ...

scala> trait Ickwals { def equals(other: Any): Boolean }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
defined class C

scala> :javap C#equals
public boolean equals(java.lang.Object);
descriptor: (Ljava/lang/Object;)Z
[generated]

scala> trait Ickwals { override def equals(other: Any): Boolean = false }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
defined class C

scala> :javap C#equals
public boolean equals(java.lang.Object);
descriptor: (Ljava/lang/Object;)Z
[as implemented]

scala> trait Ickwals { def equals(other: Any): Boolean ; def copy(i: Int): Nothing }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
<console>:8: error: class C needs to be abstract, since method copy in trait Ickwals of type (i: Int)Nothing is not defined
case class C(i: Int) extends Ickwals
^