466просмотров
18.6%от подписчиков
23 марта 2026 г.
questionScore: 513
🤔 Что происходит с полями из супер-класса при наследовании data-класса? При наследовании data class от какого-либо суперкласса в Kotlin, важно понимать, как работают свойства (поля) суперкласса и как они влияют на функциональность и структуру data class. 🚩Что происходит с полями суперкласса 🟠Наследование свойств
Поля (свойства), объявленные в суперклассе, автоматически становятся доступными в классе-наследнике. Вы можете использовать их в наследуемом классе как обычно. Однако свойства суперкласса не участвуют в автоматически сгенерированных функциях equals(), hashCode(), и toString() для data class. 🟠Автоматически сгенерированные функции в data-классе
У data class Kotlin генерирует функции equals(), hashCode(), toString(), copy() и другие. Эти функции работают только с параметрами, объявленными в первичном конструкторе data-класса. Поля, которые находятся в суперклассе, не участвуют в этих функциях. 🟠Почему поля суперкласса игнорируются Это связано с тем, что контракт data class предполагает, что все его ключевые данные (data) определяются только параметрами первичного конструктора. Это позволяет гарантировать, что две одинаковые сущности будут сравниваться и обрабатываться корректно, основываясь только на данных самого data class. // Суперкласс с полем name
open class Person(val name: String) // Наследуемый data-класс
data class Employee(val id: Int, val position: String) : Person(name = "Default") val employee1 = Employee(1, "Developer")
val employee2 = Employee(1, "Developer") println(employee1 == employee2) // true, так как сравнение основано только на id и position
println(employee1.toString()) // Employee(id=1, position=Developer) 🟠Если нужно включить поля суперкласса в сравнение
Если вы хотите, чтобы поля суперкласса учитывались в логике equals() или hashCode(), вам нужно переопределить эти функции вручную.
data class Employee(val id: Int, val position: String) : Person(name = "Default") { override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is Employee || !super.equals(other)) return false return id == other.id && position == other.position && name == other.name } override fun hashCode(): Int { return 31 * super.hashCode() + id.hashCode() + position.hashCode() }
} Ставь 👍 и забирай 📚 Базу знаний