Поделиться общими свойствами между Kotlin классами - PullRequest
1 голос
/ 01 апреля 2020

У меня есть 2 (data) класса, которые почти имеют одни и те же свойства:

data class Foo(
    val id: FooId,
    val name: String,
    ... 10+ properties
}

data class NewFoo(
    val name: String,
    ... 10+ properties
}

Я просто хочу немного синтаксиса сахар волхвов c здесь: чтобы не повторяться 10+ свойств . Я могу создать базовый sealed класс, но в итоге вы написали бы еще больше текста (для передачи аргументов в базовый класс ctor), хотя вы более защищены от ошибок.

Да, я знаю, что мог бы используйте для этого композицию, но здесь я не хочу, поскольку могут быть разные «варианты» одних и тех же данных.

Я что-то упустил или это невозможно в Kotlin?

1 Ответ

2 голосов
/ 01 апреля 2020

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

abstract class Base {
    // put commons parameter here

    // abstract param needs to be initialized in the constructor of data class
    abstract val name: String 

    // you can define some not-abstract params as well
    open lateinit var someOtherParam: String
}

data class Foo1(
    override val name: String,
    val id: Int,
    val someAdditionalParam1: String
) : Base()


data class Foo2(
    override val name: String,
    val someAdditionalParam2: String,
    override var someOtherParam: String
) : Base()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...