Доступ к свойствам класса из другого пакета, когда класс помечен как «открытый», завершается неудачно при использовании «.» и "=" обозначение - PullRequest
1 голос
/ 19 апреля 2019

Впервые на kotlin ...

В документации kotlin для объявления и доступа к свойствам говорится, что вы можете получить доступ к свойствам объекта класса с помощью точечной нотации и синтаксиса "=", который вызывает методы получения и установки:

To use a property, we simply refer to it by name, as if it were a field in Java:

fun copyAddress(address: Address): Address {
    val result = Address() // there's no 'new' keyword in Kotlin
    result.name = address.name // accessors are called
    result.street = address.street
    // ...
    return result
}

Кажется, что это работает с обычными классами, но если вы объявляете класс открытым и пытаетесь получить доступ к свойствам класса из другого пакета, это, похоже, выходит за пределы окна, и вы вынуждены явно использовать методы получения и установки. Это правильно, и если да, то почему?

package app.foo
open class FooClass {
    var fooProp = "test";

    fun doSomething() {
        // Just to show what's going on
        val tmpFoo = FooClass()
        tmpFoo.fooProp // No error here
        tmpFoo.fooProp = "New Value" // No error here
    }
}
// Different Class, same package
package app.foo
import app.foo.FooClass
class Foo2Class {
    fun doSomething() {
        // Just to show what's going on
        val tmpFoo = FooClass()
        tmpFoo.fooProp // No error here
        tmpFoo.fooProp = "New Value" // No error here
    }
}

// Different Class, different package
package app.bar
import app.foo.FooClass
class BarClass {
    fun doSomething() {
        // Just to show what's going on
        val tmpFoo = FooClass()
        tmpFoo.fooProp // Error here
        tmpFoo.fooProp = "New Value" // Error here
        tmpFoo.getFooProp() // No error here
        tmpFoo.setFooProp("New Value") // No error here
    }
}

Ошибка, которую я на самом деле вижу при попытке использовать «tmpFoo.fooProp» вне пакета app.foo, заключается в том, что «fooProp имеет частный доступ в app.foo.FooClass», что не имеет смысла, если вызов (по умолчанию) публичного геттера.

Я ожидаю, что у меня будет возможность использовать tmpFoo.fooProp для доступа к получателю и tmpFoo.fooProp = "value" для установки значения через установщик, независимо от того, в каком пакете я нахожусь.

Если я удалю ключевое слово open в FooClass, все будет работать как положено.

1 Ответ

0 голосов
/ 26 июля 2019

Как оказалось, я был глуп и пытался получить доступ к свойству kotlin из класса java, а не из класса kotlin.

В приведенных выше примерах BarClass был классом Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...