Kotlin - 我如何从另一个文件访问我的新类扩展函数

时间:2017-10-02 10:42:50

标签: kotlin extension-function

我对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

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

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

4 个答案:

答案 0 :(得分:7)

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

但问题是,IDE并没有建议我使用扩展功能的路径 - 我必须自己导入它。

我正在使用Android Studio 3预览版,希望这将得到修复。

<强>更新

最好在普通的Kotlin文件中定义这些函数,因此这些函数不会被任何结构所拥有。那么IDE从任何地方自动导入它们都不会有问题。

答案 1 :(得分:2)

首先:您的源代码中存在许多错误,您应该在此处提出问题之前修复(在构造函数中缺少类型注释,缺少val / var等)。

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

导入扩展功能非常重要

答案 2 :(得分:0)

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

这些静态函数(也称为扩展函数)有一些限制。

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

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

此外,它们是静态解析的,例如(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类。

答案 3 :(得分:0)

有一种方法可以做到:

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

Child(...).toChild2()