【问题标题】:Kotlin: How to deal with 'protected' property exposes its internal return typeKotlin:如何处理“受保护”属性暴露其内部返回类型
【发布时间】:2020-10-11 16:28:57
【问题描述】:

拥有一个基类,我希望它及其后代类仅在内部可见:

internal abstract class BaseClass
internal open class Class_A: BaseClass()
internal open class Class_B: Class_A()

Class_A 列表的位置(其中可能还包含Class_B),希望使其受保护以供其自己的后代类访问此列表

open class User {
    // got error: 'protected' property exposes its internal return type" 
    protected var class_A_list: List<Class_A>? = null
}

class User_descendent: User() {
    // can access the class_A_list
}

如何让后代类访问某个“内部”类的实例?

【问题讨论】:

    标签: kotlin inheritance class-visibility


    【解决方案1】:

    上述错误是保护internal 类被不在内部类的同一模块中的其他类访问。如果允许,则不能保证类User 只会被同一模块中的类继承。

    所以如果你想让class_A_list 受到保护,你必须让Userinternal。通过这样做,它将保证User 将被同一模块中的类继承。以下应该没问题:

    internal open class User {
       protected var class_A_list: List<Class_A>? = null
    }
    

    【讨论】:

    • 是的,但你也必须将User_descendent 设为内部,否则你会运行:'public' 子类公开其内部超类型'User'
    • @stinepike 谢谢!但不能将“用户”设为内部,它是库的一部分并打算在外部扩展。想知道为什么 kotlin 有这个限制,或者有办法这样做。
    • @lannyf,您能否描述一下您要实现的目标。可能有更好的方法来做到这一点,而不是使用内部链。如果你能更清楚地描述你的用例场景(比如哪些部分是外部库,你必须做哪些内部以及为什么等)
    • 当然,它是一个库,用户类是开放的,允许内部和外部扩展。在用户中,它有 list ,其中 T 是在用户包的内部定义的(不想将 T 暴露在包的外部,但仍希望用户在外部访问)。
    • 如果您希望您的图书馆用户能够继承此 User 类并有权访问其 Class_A 相关属性,则 Class_A 不能是内部的。相反,您可以定义Class_A 实现的公共接口并使protected 列表具有该类型。
    猜你喜欢
    • 2013-04-08
    • 2011-03-11
    • 1970-01-01
    • 2019-12-14
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多