Почему класс данных не может соответствовать интерфейсу, если его свойство соответствует интерфейсу свойства интерфейса? - PullRequest
0 голосов
/ 16 марта 2020
interface BarInterface {
    val bar: Int
}

interface FooBarInterface {
    var foo: BarInterface
}

data class Bar(override val bar: Int): BarInterface {}

data class FooBar(override val foo: Bar): FooBarInterface {}

терпит неудачу с

Var-property public open val foo: Bar defined in FooBar cannot be \
overridden by val-property public abstract var foo: \
BarInterface defined in FooBarInterface
Type of 'foo' doesn't match the type of the overridden var-property \
'public abstract var foo: BarInterface defined in FooBarInterface'

Как обойти это, сохраняя подход интерфейса / класса данных?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Поскольку это var, следующий код должен быть допустимым:

class Bar2(override val bar: Int): BarInterface {}

val fooBar: FooBarInterface = FooBar(Bar(0))
fooBar.bar = Bar2(0)

Но тогда вы устанавливаете fooBar.bar на Bar2, и он допускает только Bar (даже если вы изменить на data class FooBar(override var foo: Bar)).

С val bar в FooBarInterface это будет работать.

0 голосов
/ 16 марта 2020

Я попробовал несколько вещей, я думаю, что мой лучший подход на данный момент -

interface BarInterface {
    val bar: Int
}

interface FooBarInterface {
    var _foo: BarInterface
    val foo get() = _foo
}

data class Bar(override val bar: Int): BarInterface {}

data class FooBar(override val foo: Bar): FooBarInterface {
    override var _foo: BarInterface = foo
}

, который позволяет мне делать

val bar = Bar(bar = 1)
val fooBar = FooBar(foo = bar)
val barInterface: BarInterface = bar
val fooBarInterface: FooBarInterface = fooBar

print(fooBar.foo.bar)
print(fooBarInterface.foo.bar)

, что не очень хорошо, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...