Kotlin protected 属性 无法在其他模块中访问
Kotlin protected property can not be accessed in other module
就在我以为自己明白了的时候,我遇到了以下问题。
我在另一个模块中有一个 base class(这里称为 base)
看起来是这样的:
open class BaseTest {
companion object {
lateinit var baseTest: BaseTest
}
protected open var someProperty: String? = "base"
}
我想设置 属性 并保护它,以便我在另一个模块中扩展的 class 可以访问它。
class Extended: BaseTest() {
fun extendedCall() {
BaseTest().someProperty = "extended"
baseTest.someProperty = "extended"
}
}
但是,无论是静态的还是直接的 属性 都无法访问,并指出以下错误:
Cannot access 'someProperty': it is protected in 'BaseTest'
但是自从 BaseTest() 的扩展固有特性以来,难道不应该可以访问它吗?我的意思是受保护的定义是“声明仅在其 class 及其子 classess 中可见”,所以我错过了什么?它甚至不能在同一个模块中工作,所以这不是原因。
我错过了什么?
我认为 protected
修饰符在 Kotlin 中的工作方式不同。
The protected modifier is not available for top-level declarations.
但我同意它写得相当混乱。文档似乎更侧重于通过 this
关键字实现的 Outter/Inner class 关系。
BaseTest().someProperty = "extended"
在这里你通过调用构造函数创建了一个新的 BaseTest 对象 BaseTest()
并且你不能访问 other BaseTest 对象的受保护属性。
baseTest.someProperty = "extended"
静态 BaseTest 对象也是另一个对象,而不是扩展对象本身。
受到保护仅仅使做事成为可能
someProperty = "extended"
或等价物
this.someProperty = "extended"
即访问this对象的属性。
就在我以为自己明白了的时候,我遇到了以下问题。
我在另一个模块中有一个 base class(这里称为 base)
看起来是这样的:
open class BaseTest {
companion object {
lateinit var baseTest: BaseTest
}
protected open var someProperty: String? = "base"
}
我想设置 属性 并保护它,以便我在另一个模块中扩展的 class 可以访问它。
class Extended: BaseTest() {
fun extendedCall() {
BaseTest().someProperty = "extended"
baseTest.someProperty = "extended"
}
}
但是,无论是静态的还是直接的 属性 都无法访问,并指出以下错误:
Cannot access 'someProperty': it is protected in 'BaseTest'
但是自从 BaseTest() 的扩展固有特性以来,难道不应该可以访问它吗?我的意思是受保护的定义是“声明仅在其 class 及其子 classess 中可见”,所以我错过了什么?它甚至不能在同一个模块中工作,所以这不是原因。
我错过了什么?
我认为 protected
修饰符在 Kotlin 中的工作方式不同。
The protected modifier is not available for top-level declarations.
但我同意它写得相当混乱。文档似乎更侧重于通过 this
关键字实现的 Outter/Inner class 关系。
BaseTest().someProperty = "extended"
在这里你通过调用构造函数创建了一个新的 BaseTest 对象 BaseTest()
并且你不能访问 other BaseTest 对象的受保护属性。
baseTest.someProperty = "extended"
静态 BaseTest 对象也是另一个对象,而不是扩展对象本身。
受到保护仅仅使做事成为可能
someProperty = "extended"
或等价物
this.someProperty = "extended"
即访问this对象的属性。