【问题标题】:Kotlin - How i can access my new class extension function from another fileKotlin - 我如何从另一个文件访问我的新类扩展功能
【发布时间】:2018-03-13 10:26:48
【问题描述】:

我对 Kotlin 很陌生。

我希望能够向我的抽象类添加一个函数,因此当我定义该函数时,我将能够在该类的每个孩子上调用它(它们继承抽象类)

但是,我想在其他文件中定义这些扩展函数。 当我尝试在抽象类的特定子实现上调用这些函数时,我无法访问它们。

我需要制定哪些规则来解决我的问题?

我希望能够实现这样的目标:

abstract class Parent(val val1, val val2, val val3){}

class Child(var val1, var val2, var val3) : Parent(val1, val2, val3){}

class Child2(var val1, var val2, var val3) : Parent(val1, val2, val3){}

父母和所有孩子的扩展方法:

 fun Parent.convertToChild2( ): Child2? {

return //some creation method of Child2
} 

我希望能够调用它:

child: Child
child.convertToChild2

我在单独的文件中定义了所有类,还在其他文件中定义了扩展函数。

我无法访问这样的功能 - 不可见。

【问题讨论】:

    标签: kotlin extension-function


    【解决方案1】:

    让我满意的问题的答案就是将方法提取到其他文件中的某个“对象”结构中,并且每当我们想要访问该函数时 我们必须导入路径(package.object.method) 到这个。

    但问题是,IDE 并没有为我提供扩展功能的路径 - 我必须自己导入它。

    我正在使用 Android Studio 3 预览版,希望可以解决此问题。

    更新

    最好在纯 Kotlin 文件中定义这些函数,这样这些函数将不属于任何结构。那么 IDE 自动从任何地方导入都不是问题。

    【讨论】:

    • 感谢作品不要忘记公开方法。
    • 最好的方法是在单独的新文件中添加扩展方法。不要将其写在任何ClassObject 中。
    【解决方案2】:

    有办法做到这一点:

    fun <T: Parent> T.toChild2() {
        TODO()
    }
    
    Child(...).toChild2()
    

    【讨论】:

      【解决方案3】:

      我认为这里对扩展函数存在误解。扩展函数是常规的静态函数,当您定义函数并对其进行操作时,它会隐式地接收接收器类的实例作为参数。

      这些静态函数(又名扩展函数)有一些限制。

      它们没有添加到类层次结构中,因此子类不能继承它们(如果为父类定义扩展函数,则不能期望该方法存在于子类中)

      他们无权访问他们正在扩展的类的私有属性。

      另外,它们是静态解析的,例如 (taken from here)

      open class Shape
      
      class Rectangle: Shape()
      
      fun Shape.getName() = "Shape"
      
      fun Rectangle.getName() = "Rectangle"
      
      fun printClassName(s: Shape) {
        println(s.getName())
      }     
      
      printClassName(Rectangle())
      

      这个例子打印“Shape”,因为被调用的扩展函数只依赖于参数s的声明类型,即Shape类。

      【讨论】:

        【解决方案4】:

        首先:你的源代码有很多错误,你应该在问问题之前修复(在构造函数中缺少类型注释,缺少val/var等)。

        对于您的问题: 通常,即使在不同的 kt 文件中定义,您也可以访问扩展功能。阅读涵盖extension scopes 的官方文档。

        导入扩展函数很重要

        【讨论】:

        • 感谢您的回答,我只是在询问这个概念,并没有真正深入了解细节。如果需要,请参阅我对问题的回答。
        • 好吧,对不起。我添加了关于导入的提示
        • 但问题是,IDE 并没有为我提供扩展功能的路径 - 我必须自己导入它
        • 其实可以的,至少IntelliJ有能力这样做
        • 好的,我用的是Android Studio 3,也是预览版
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 2020-12-29
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多