#kotlin
Вопрос:
ребята, я изучаю котлин. От https://kotlinlang.org/docs/interfaces.html#properties-in-interfaces там написано:
Свойства, объявленные в интерфейсах, не могут иметь резервных полей, и поэтому средства доступа, объявленные в интерфейсах, не могут ссылаться на них.
(Я думаю, что местоимение «они» в конце цитируемого предложения должно относиться к «свойствам», а не к «полям». )
Однако следующий код работает. Похоже, что мы можем ссылаться на свойства. Почему print(prop)
тогда выделен красным цветом?
interface MyInterface {
val prop: Int // abstract
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(prop) // this is highlighted red but it works. what's does the author want to say?
}
}
class Child : MyInterface {
override val prop: Int = 29
}
fun main() {
val c = Child()
c.foo()
}
Кроме того, я заметил, что в приведенном выше примере foo
нет доступа. Поэтому я попробовал следующий пример, и он тоже работает:
interface User {
val email: String
val nickname: String
get() = email.substringBefore('@') // aren't we referring to a property in accessor? why does this work then?
}
Итак, что же автор хочет здесь сказать? что означает «они»?
Комментарии:
1. основываясь на этой статье, я думаю, что она относится к полям: baeldung.com/kotlin/backing-fields
Ответ №1:
«Они» в этом предложении означает «поля».
Свойство в основном является получателем (установщиком), и оно может быть дополнительно подкреплено полем. По техническим причинам интерфейсы не могут содержать поля, поэтому свойства в интерфейсах должны быть «без полей». Свойство должно быть либо абстрактным, либо его реализация может использовать только, например, другие свойства/функции, но не может напрямую хранить/считывать какие-либо данные. Обратите внимание, что ссылка на другие свойства не нарушает вышеуказанное правило, потому что, как я уже сказал, свойство в основном является средством получения/установки, а не полем.
print(prop)
выделяется красным цветом, потому что… ну, вот как автоматический маркер раскрасил его… 🙂