import kotlin.reflect.KProperty import kotlin.properties.ReadWriteProperty // type must be exposed otherwise `provideDelegate` doesn't work abstract class StoredPropertyBase : ReadWriteProperty abstract class StoredPropertyDerived : StoredPropertyBase() { operator fun provideDelegate(thisRef: Any, property: KProperty<*>): StoredPropertyBase { return this } } abstract class BaseState { protected abstract fun propertyDerived(initialValue: PROPERTY_TYPE): StoredPropertyDerived protected abstract fun propertyBase(initialValue: PROPERTY_TYPE): StoredPropertyBase } abstract class Some : BaseState() { val hideBySeverityDerived: MutableSet by propertyDerived(mutableSetOf()) val hideBySeverityBase: MutableSet by propertyBase(mutableSetOf()) }