在 Kotlin 中如何从不同的模块访问内部成员

Posted

技术标签:

【中文标题】在 Kotlin 中如何从不同的模块访问内部成员【英文标题】:How can I access the internal members from a different module in Kotlin? 【发布时间】:2022-01-14 16:30:33 【问题描述】:

在 Kotlin 中,当对公共类的成员函数应用“内部”时,它只在模块内部可见。

如果有核心模块,另一个模块(称为外部模块),其类派生自核心模块中定义的类。

核心模块

package com.core

class BaseClass 
   internal fun method_internal() ...
   public fun method_public() ...

在核心模块中,method_internal()可以在BaseClass之外访问。

在app中,凡是依赖核心模块的,BaseClass都可以在app中使用,但在app中看不到内部的method_internal()。这就是想要的 internal 行为。

在另一个模块(外部模块)中,它具有派生自 BaseClass 的类

外部模块

package com.outermodule

class DerivedClass : BaseClass 
......

在外部模块中它可以使用来自 DerivedClass 的method_public(), 但无法访问method_internal()

并且不能将method_internal 设为protected,因为它应该允许在核心模块中的任何地方进行访问。

如何使方法在一个模块中具有internal可见性,但至少能够从另一个模块中的派生类访问?

【问题讨论】:

您可以在基类public 中创建另一个方法,该方法接受一个键作为参数,以便运行method_internal 【参考方案1】:

它不是很漂亮,但你可以创建两个函数。

open class BaseClass 
    protected fun foo() 
        println("foo!")
    

    internal fun fooInternal() = foo()


【讨论】:

以上是关于在 Kotlin 中如何从不同的模块访问内部成员的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 中内部可见性修饰符的范围

kotlin访问控制符可见性

无法从 Gradle 中的替代测试源集访问 Kotlin 内部成员

在 kotlin 中,如何从子类访问父类中受保护的静态成员

Kotlin学习3-类(嵌套/内部类,数据/静态类)

[Kotlin] 内部类