Переопределяющий val, определенный в интерфейсе, с использованием var с тем же именем, определенным в суперклассе

Существует базовый класс ( var должен оставаться защищенным):

open class Base(protected var id: Int) {} 

Существует интерфейс, который должен использовать val :

 interface ProviderI { val id: Int } 

Существует также класс, который наследует от Base и реализует интерфейс ProviderI . Внутри которой я пытаюсь реализовать val в интерфейсе, используя суперкласс var (который имеет то же имя). Как нерабочий пример, я пытаюсь сделать что-то подобное (пример не работает):

 class Instance(id: Int): Base(id), ProviderI { override val id get() { return super.id } } 

Идея проста, но я пробовал все и каждый раз, когда сообщается о различной ошибке.

Чтобы переопределить элемент, присутствующий в нескольких супертипах, Котлин требует, чтобы он был open во всех супертипах , и это ограничение выглядит вполне естественным, потому что в противном случае final члены могут быть легко переопределены таким образом.

Решение состоит в том, чтобы сделать id открытым в Base и переопределить его как свойство var :

 open class Base(protected open var id: Int) interface ProviderI { val id: Int } class Instance(id: Int): Base(id), ProviderI { override var id: Int get() = super.id set(value) { super.id = value } } 

Kotlin не позволяет свойствам val переопределять свойства var .

Ближайшая вещь, которая будет работать:

 open class Base(protected open var id: Int) {} interface ProviderI { val id: Int } class Instance(id: Int): Base(id), ProviderI { override var id: Int = 0 get() { return super.id } }