Intereting Posts
Объем переменной, определенной для заголовка цикла Почему прокрутка ViewPager перед тем, как изменить его заполнение и pagemargin, полностью подвела его? Почему я получаю несоответствие типа при попытке вернуть значение для проверенного общего параметра? Безопасно ли вызывать kclass.memberProperties на неизвестном (Any) объекте? Не удается сохранить модель данных, содержащую Список <Модель> с комнатой ORM Kotlin Определить возвращаемый тип Retrofit с использованием интерфейса вместо класса Как заменить дублирующиеся пробелы в String в Kotlin? Что отличается между двумя конструкторами? Почему мой код недоступен? Использование Kotlin и Firebase для запуска sendEmailVerification с обратным вызовом onAuthStateChanged Как создать объект из класса kotlin в java-классе? Есть ли способ вложить enum в класс данных в Котлин? Переопределение одной и той же подписи из разных закладок Val не может переназначить ошибку времени компиляции для локальной переменной в fun в kotlin почему kotlin использует === сравнить примитивный тип, равный друг другу, если они имеют одинаковое значение

Как позволить классу данных реализовать интерфейс / расширяет свойства суперкласса в Котлине?

У меня есть несколько классов данных, которые включают var id: Int? поле. Я хочу выразить это в интерфейсе или суперклассе и иметь классы данных, расширяющие это и устанавливая этот id когда они будут построены. Однако, если я попробую это:

 interface B { var id: Int? } data class A(var id: Int) : B(id) 

Он жалуется, что я переопределяю поле id , которое я ха-ха ..

В : Как я могу позволить классу данных A в этом случае взять id при его построении и установить id объявленный в интерфейсе или суперклассе ?

Действительно, вам еще не нужен абстрактный класс . вы можете просто переопределить свойства интерфейса , например:

 interface B { val id: Int? } // v--- override the interface property by `override` keyword data class A(override var id: Int) : B 

Интерфейс не имеет конструкторов, поэтому вы не можете вызвать конструктор по ключевому слову super(..) , но вместо этого вы можете использовать абстрактный класс . Howerver, класс данных не может объявлять какие-либо параметры в своем основном конструкторе , поэтому он перезапишет поле суперкласса, например:

 // v--- makes it can be override with `open` keyword abstract class B(open val id: Int?) // v--- override the super property by `override` keyword data class A(override var id: Int) : B(id) // ^ // the field `id` in the class B is never used by A // pass the parameter `id` to the super constructor // v class NormalClass(id: Int): B(id)