为什么可以在扩展函数中传递接口的方法/属性
why the methods /propreties of an interface can be passed in an extension function
今天我不得不使用一个扩展函数,它有一个接口作为谓词,一种 Interface.whateverExtensionFunction()
我有一个 class ViewModel () :InterfaceInherithingFromAnotherInterface
。建筑理念
后面是保持我的 viewModel 整洁并将一些重量级委托给扩展功能。
我不明白为什么我可以通过任何方法进入我的 ViewModel,我可以调用扩展函数 FruitColorsInterface.changeColors()
就像下面的代码一样进入方法 cut()
我没看懂怎么可能有效进入扩展函数,我可以调用接口方法
如果 class 实现了一个接口,这是一个约定 实现接口的方法 而不是传递一个对象 接口发生在这个扩展中 class**
class testInterface(){
@Test
fun testInterface(){
AppleTrim().cut()
}
}
class AppleTrimViewModel : FruitColorsInterface{
override val red: String
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val green: String
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override fun mixColors(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun move3d() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun spinFromTop(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
fun cut(){
changeColors()
//FruitColorsInterface.changeColors()//why this is error?
}
}
interface FruitColorsInterface {
val red :String
val green:String
fun mixColors(): String
fun move3d()
fun spinFromTop() :Int
}
fun FruitColorsInterface.changeColors(){
println("Ehy")
mixColors()//WHY IS THAT?
}
如果我在 Java 中反编译,我会得到一个静态函数,其中传递了一个接口
public static final void changeColors(@NotNull FruitColorsInterface $this$changeColors) {
Intrinsics.checkParameterIsNotNull($this$changeColors, "$this$changeColors");
String var1 = "Ehy";
System.out.println(var1);
$this$changeColors.mixColors();
}
//and
public final void cut() {
Test_interfaceKt.changeColors(this);
}
在扩展函数的范围内,您有一个扩展类型的实例(在您的示例中为 FruitColorsInterface
),可用作 this
— 隐式接收器。
使用该 this
实例,您可以调用该类型可用的其他函数和属性,无论它们是成员还是扩展。
至于为什么你可以在扩展函数体中调用 mixColors()
而不是 this.mixColors()
,这是因为 this
是隐式可用的,与成员函数体中相同,并且因此可以省略。
今天我不得不使用一个扩展函数,它有一个接口作为谓词,一种 Interface.whateverExtensionFunction()
我有一个 class ViewModel () :InterfaceInherithingFromAnotherInterface
。建筑理念
后面是保持我的 viewModel 整洁并将一些重量级委托给扩展功能。
我不明白为什么我可以通过任何方法进入我的 ViewModel,我可以调用扩展函数 FruitColorsInterface.changeColors()
就像下面的代码一样进入方法 cut()
我没看懂怎么可能有效进入扩展函数,我可以调用接口方法
如果 class 实现了一个接口,这是一个约定 实现接口的方法 而不是传递一个对象 接口发生在这个扩展中 class**
class testInterface(){
@Test
fun testInterface(){
AppleTrim().cut()
}
}
class AppleTrimViewModel : FruitColorsInterface{
override val red: String
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val green: String
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override fun mixColors(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun move3d() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun spinFromTop(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
fun cut(){
changeColors()
//FruitColorsInterface.changeColors()//why this is error?
}
}
interface FruitColorsInterface {
val red :String
val green:String
fun mixColors(): String
fun move3d()
fun spinFromTop() :Int
}
fun FruitColorsInterface.changeColors(){
println("Ehy")
mixColors()//WHY IS THAT?
}
如果我在 Java 中反编译,我会得到一个静态函数,其中传递了一个接口
public static final void changeColors(@NotNull FruitColorsInterface $this$changeColors) {
Intrinsics.checkParameterIsNotNull($this$changeColors, "$this$changeColors");
String var1 = "Ehy";
System.out.println(var1);
$this$changeColors.mixColors();
}
//and
public final void cut() {
Test_interfaceKt.changeColors(this);
}
在扩展函数的范围内,您有一个扩展类型的实例(在您的示例中为 FruitColorsInterface
),可用作 this
— 隐式接收器。
使用该 this
实例,您可以调用该类型可用的其他函数和属性,无论它们是成员还是扩展。
至于为什么你可以在扩展函数体中调用 mixColors()
而不是 this.mixColors()
,这是因为 this
是隐式可用的,与成员函数体中相同,并且因此可以省略。