Han XIAO
Han XIAO

Reputation: 1248

refer to property defined in interface, kotlin

guys, I am learning kotlin. From https://kotlinlang.org/docs/interfaces.html#properties-in-interfaces it says:

Properties declared in interfaces can't have backing fields, and therefore accessors declared in interfaces can't reference them.

(I think the pronoun "them" at the end of quoted sentence should refer to "properties" rather than "fields". )

However the following code works. It seems that we can refer to properties. Why is print(prop) highlighted as red then?

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()
}

Besides, I noticed that in the above example foo is not accessor. So I tried following example and it works too:

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?
}

So what does the author want to say in here? what does "them" refer to?

Upvotes: 0

Views: 435

Answers (1)

broot
broot

Reputation: 28342

"Them" in this sentence means "fields".

Property is basically a getter (setter) and it could be optionally backed by a field. For technical reasons interfaces can't hold fields, so properties in interfaces have to be "fieldless". Property has to be either abstract or its implementation can only use e.g. other properties/functions, but it can't store/read any data directly. Note that referencing other properties does not break above rule, because, as I said, property is mainly a getter/setter, not a field.

print(prop) is highlighted as red, because... well, this is how automatic highlighter colored it... :-)

Upvotes: 2

Related Questions