Kotlin - 我如何从另一个文件访问我的新 class 扩展函数
Kotlin - How i can access my new class extension function from another file
我对 Kotlin 很陌生。
我希望能够向我的抽象 class 添加一个函数,因此当我定义该函数时,我将能够在每个 child 从那个 class 调用它(他们继承了摘要class)
但是,我想在其他文件中定义这些扩展函数。
当我尝试在抽象 class.
的特定 child 实现上调用它们时,我无法访问这些函数
我需要制定什么规则来解决我的问题?
我想通过能够实现这样的事情:
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){}
parent和所有child的扩展方法:
fun Parent.convertToChild2( ): Child2? {
return //some creation method of Child2
}
我希望能够调用这个:
child: Child
child.convertToChild2
我在单独的文件中定义了所有 classes 并且还在其他文件中定义了扩展函数。
我无法访问这样的功能 - 不可见。
首先:你的源代码中有很多错误,你应该在在这里提问之前修复(构造函数中缺少类型注释,缺少 val
/var
等)。
针对您的问题:
通常,即使定义在不同的 kt 文件中,您也可以访问扩展函数。阅读涵盖 extension scopes.
的官方文档
导入你的扩展函数很重要
我的问题的答案令我满意,只是将方法提取到其他文件中的某个“对象”结构中,每当我们想要访问该函数时我们必须导入路径(package.object.method)到这个.
但问题是,IDE 没有建议我扩展函数的路径 - 我必须自己导入它。
我正在使用 Android Studio 3 预览版,希望这会得到解决。
更新
最好只在普通的 Kotlin 文件中定义这些函数,这样函数将不属于任何结构。那么 IDE 从任何地方自动导入这些都不是问题。
我认为这里对扩展函数存在误解。扩展函数是常规的静态函数,当您定义函数并对其进行操作时,它隐式地将接收者 class 的实例作为参数。
这些静态函数(又名扩展函数)有一些限制。
它们没有添加到 class 层级中,所以子 classes 不能继承它们(如果你为 parent class 定义扩展函数你不能希望该方法出现在 child class)
他们无权访问他们正在扩展的 class 的私有属性。
此外,它们是静态解析的,例如 (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 class.
有一种方法可以做到:
fun <T: Parent> T.toChild2() {
TODO()
}
Child(...).toChild2()
我对 Kotlin 很陌生。
我希望能够向我的抽象 class 添加一个函数,因此当我定义该函数时,我将能够在每个 child 从那个 class 调用它(他们继承了摘要class)
但是,我想在其他文件中定义这些扩展函数。 当我尝试在抽象 class.
的特定 child 实现上调用它们时,我无法访问这些函数我需要制定什么规则来解决我的问题?
我想通过能够实现这样的事情:
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){}
parent和所有child的扩展方法:
fun Parent.convertToChild2( ): Child2? {
return //some creation method of Child2
}
我希望能够调用这个:
child: Child
child.convertToChild2
我在单独的文件中定义了所有 classes 并且还在其他文件中定义了扩展函数。
我无法访问这样的功能 - 不可见。
首先:你的源代码中有很多错误,你应该在在这里提问之前修复(构造函数中缺少类型注释,缺少 val
/var
等)。
针对您的问题: 通常,即使定义在不同的 kt 文件中,您也可以访问扩展函数。阅读涵盖 extension scopes.
的官方文档导入你的扩展函数很重要
我的问题的答案令我满意,只是将方法提取到其他文件中的某个“对象”结构中,每当我们想要访问该函数时我们必须导入路径(package.object.method)到这个.
但问题是,IDE 没有建议我扩展函数的路径 - 我必须自己导入它。
我正在使用 Android Studio 3 预览版,希望这会得到解决。
更新
最好只在普通的 Kotlin 文件中定义这些函数,这样函数将不属于任何结构。那么 IDE 从任何地方自动导入这些都不是问题。
我认为这里对扩展函数存在误解。扩展函数是常规的静态函数,当您定义函数并对其进行操作时,它隐式地将接收者 class 的实例作为参数。
这些静态函数(又名扩展函数)有一些限制。
它们没有添加到 class 层级中,所以子 classes 不能继承它们(如果你为 parent class 定义扩展函数你不能希望该方法出现在 child class)
他们无权访问他们正在扩展的 class 的私有属性。
此外,它们是静态解析的,例如 (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 class.
有一种方法可以做到:
fun <T: Parent> T.toChild2() {
TODO()
}
Child(...).toChild2()