当使用“。”标记类为“打开”时,从其他包访问类属性失败。和“ =”符号

时间:2019-04-18 21:03:02

标签: kotlin

kotlin的新手...

在用于声明和访问属性的kotlin文档中,它说您可以使用点表示法和“ =”语法来访问类对象的属性,这将调用getter和setter:

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
}

这似乎与常规类一起使用,但是如果您将一个类声明为open并尝试从另一个包中访问类属性,则这似乎不合时宜,您被迫显式使用getter和setter。这是正确的吗?如果正确,为什么?

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

尝试在app.foo包之外使用“ tmpFoo.fooProp”时实际上看到的错误是“'fooProp'在app.foo.FooClass中具有私有访问权”,如果它是调用(默认情况下)公共获取器。

我希望能够使用tmpFoo.fooProp来访问getter,并且无论我在哪个软件包中,都可以使用setter通过tmpFoo.fooProp =“ value”来设置值。

如果我删除FooClass上的open关键字,那么一切都会按预期进行。

1 个答案:

答案 0 :(得分:0)

事实证明,我很愚蠢,试图从Java类而不是kotlin类访问kotlin属性。

在上面的示例中,BarClass是一个Java类。