Kotlin:如何处理“受保护”属性公开其内部返回类型

lan*_*nyf 5 inheritance class-visibility kotlin

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

internal abstract class BaseClass
internal open class Class_A: BaseClass()
internal open class Class_B: Class_A()
Run Code Online (Sandbox Code Playgroud)

在列表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
}
Run Code Online (Sandbox Code Playgroud)

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

sti*_*ike 5

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

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

internal open class User {
   protected var class_A_list: List<Class_A>? = null
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望库用户能够子类化此 User 类并有权访问其与“Class_A”相关的属性,则“Class_A”不能是内部的。相反,您可以定义“Class_A”实现的公共接口,并使“受保护”列表具有该类型。 (2认同)