Вы можете создать свойство без вспомогательного поля, а затем переопределить свою абстрактную функцию следующим образом:
class Foo : IFoo {
private var hiddenSelected = false
val selected get() = hiddenSelected
override fun setSelected(isActive: Boolean) {
hiddenSelected = isActive
}
}
Обновление:
После сна я думаю, что это решение совсем не так хорошо по двум причинам:
- Вводит новое поле (
hiddenSelected
), в котором нет необходимости
- Вы не можете делать присвоения этому полю, используя стандартные способы Котлина (оператор
=
)
Я думаю, что лучшим решением будет следующее:
class Foo : IFoo {
@set:JvmName("setSelected0")
var selected: Boolean = false
set(value) { setSelected(value) }
override fun setSelected(isActive: Boolean) {
// Possibly some other stuff
println("Now i'm using my own setter!")
selected = isActive
}
}
Используя аннотацию @ JvmName , вы можете указать компилятору, как назвать эту конкретную функцию. Kotlin автоматически создает метод получения и установки для каждого свойства, поэтому вам нужно использовать модификатор set:
, чтобы аннотировать установщик этого свойства, а не само свойство.
Также очень важно, чтобы вы реализовали пользовательский установщик для этого свойства, чтобы вы могли безопасно написать это:
Foo().selected = true // This also prints "Now i'm using my own setter!"
вместо этого:
Foo().setSelected(true)
Ваш сеттер, возможно, может делать некоторые другие вещи (например, распечатывать этот журнал), которые могут иметь побочные эффекты, поэтому вам нужно убедиться, что вы вызываете правильного сеттера. Иногда это может быть немного сложно, поскольку Kotlin всегда создает установщик для каждой изменяемой переменной (var
).