Android Developer
Android Developer

Reputation: 9643

Setting setter of an interface in class implementing it

Just begin with using kotlin in android-

I am trying to use setter of an interface in a class implementing it-

interface MyInterface {
    val prop: Int // abstract

var propertyWithImplementation: String
    get() = "foo"
set(text){"$text foo"}

fun foo() {
    print(prop)
}

}

class Child : MyInterface {
    override val prop: Int = 29
 override var propertyWithImplementation="bhu"

}
fun main(args: Array<String>) {
    println(Child().propertyWithImplementation)
}

Output:bhu

Expected Output=bhu foo

Where am i going wrong?

Upvotes: 0

Views: 2546

Answers (1)

Alexey Romanov
Alexey Romanov

Reputation: 170713

You are overriding the var, not setting it, and not using the parent setter in the override, so it ends up not being used in any way. Setting it would look like e.g.

class Child : MyInterface {
    override val prop: Int = 29
    init {
        propertyWithImplementation="bhu"
    }
}

but if you do that the output will be foo because that's what the getter always returns. And the setter doesn't actually set anything, it just creates a string and ignores it.

You don't have backing fields in an interface, so you'll need to store the value somewhere else, e.g.

interface MyInterface {
    protected var backingProperty: String

    var propertyWithImplementation: String
        get() = backingProperty
        set(text){ backingProperty = "$text foo" }
}

class Child {
    override var backingProperty = "foo"
}

to fix this problem.

Upvotes: 4

Related Questions