Вызов суперкласс класса в Котлин, Супер не является выражением

У меня есть два класса Entity и Account as

 abstract class Entity( var id: String? = null, var created: Date? = Date()) { constructor(entity: Entity?) : this() { fromEntity(entity) } fun fromEntity(entity: Entity?): Entity { id = entity?.id created = entity?.created return this; } } 

а также

 data class Account( var name: String? = null, var accountFlags: Int? = null ) : Entity() { constructor(entity: Entity) : this() { super(entity) } } 

Который дает мне ошибку

Супер не выражение, его можно использовать только в левой части точки.

Почему я не могу это сделать?

Ниже приведена ошибка компиляции, но я не уверен, что она правильная.

  constructor(entity: Entity) : this() { super.fromEntity(entity) } 

У вас есть пара проблем в коде.

Во-первых, это правильный синтаксис, чтобы вызвать супер-конструктор из вторичного конструктора:

 constructor(entity: Entity) : super(entity) 

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

Решение 1

 abstract class Entity( var id: String, var created: Date ) class Account( var name: String, var accountFlags: Int, id: String, created: Date ) : Entity(id, created) { constructor(account: Account) : this(account.name, account.accountFlags, account.id, account.created) } 

Здесь конструктор копирования находится в дочернем классе, который просто передает основной конструктор.

Решение 2

 abstract class Entity( var id: String, var created: Date ) { constructor(entity: Entity) : this(entity.id, entity.created) } class Account : Entity { var name: String var accountFlags: Int constructor(name: String, accountFlags: Int, id: String, created: Date) : super(id, created) { this.name = name this.accountFlags = accountFlags } constructor(account: Account) : super(account) { this.name = account.name this.accountFlags = account.accountFlags } } 

Здесь я использую только вспомогательные конструкторы в дочернем классе, которые позволяют мне делегировать их отдельным суперконструкторам. Обратите внимание, как код довольно длинный.

Решение 3 (большинство идиоматических)

 abstract class Entity { abstract var id: String abstract var created: Date } data class Account( var name: String, var accountFlags: Int, override var id: String, override var created: Date ) : Entity() 

Здесь я опустил конструкторы копирования и сделал абстрактные свойства, чтобы у дочернего класса были все свойства. Я также сделал класс child классом data class . Если вам нужно клонировать класс, вы можете просто вызвать account.copy() .

Используйте этот super<Entity>.fromEntity(entity) для вызова методов суперкласса.

Как говорится в документации:

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

 constructor(entity: Entity) : this() { super<Entity>.fromEntity(entity) } 

Чтобы узнать больше, ознакомьтесь с Правилами переадресации

Intereting Posts
Могу ли я ленить инициализировать значение в зависимости от конструктора? Как решить KaptError: ошибка при обработке аннотаций в Android Studio 3.0? Когда экземпляр Kotlin (объявленный с помощью модификатора объекта) создается? Можно ли определить значение по умолчанию для функции параметра? JOOQ с Gradle и Kotlin не генерируют файлы Как я могу использовать метод (String) Java String непосредственно из источника Kotlin? Отключить кнопку Безглавая однопользовательская библиотека для JVM и JavaScript Самый короткий возможный код для создания исключения в Котлине? Удалить слушателя Firebase не работает Как получить доступ к статическим полям с отражением в котлин? RxJava zipWith Ошибка IDE в Kotlin с использованием Android Studio 3.0 Spring & kotlin: В чем разница между инсталляцией конструктора и латинита? Kotlin: set-ish setter, который возвращает «this» Kotlin – преобразовать цикл в функциональный стиль