обратитесь к свойству, определенному в интерфейсе, котлин

#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) выделяется красным цветом, потому что… ну, вот как автоматический маркер раскрасил его… 🙂