parent-child - Kotlin:子类如何在 super 构造函数调用中使用父类的扩展功能?

标签 parent-child subclass extension-methods kotlin

子类如何在lambda字段中使用其父类的扩展功能?

考虑这个父类:

abstract class Parent(val field: Int.() -> Any) { 
    fun Int.print() = println(this) 
}

这个 child :
class Child : Parent({
    print() // DOESN'T COMPILE
    this.print() // DOESN'T COMPILE

    5.print() // DOESN'T COMPILE

    val value = 5
    value.print() // DOESN'T COMPILE
})

最佳答案

您不能在Parent super 构造函数调用参数内使用Child的扩展名的原因是,此时尚未对其Parent部分进行初始化,因此不能用作扩展名的派发接收器。

Member extension functions可以使用结束类的成员,这意味着它们需要与之一起使用的类的实例,并且您不能在其自己的构造函数参数中使用该实例。

否则,您可以在Parent成员内部和构造函数(或Child块)中的任何地方使用init的扩展名,因为在自己的构造函数之前调用了 super 构造函数:

class Child : Parent {
    constructor(): super({}) {
        5.print()
    }

    fun f() {
        5.print()
    }

    val g: (Int) -> Unit = { it.print() }
}

关于parent-child - Kotlin:子类如何在 super 构造函数调用中使用父类的扩展功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131406/

相关文章:

javascript - 删除具有某个类的所有元素,直到到达下一个元素

javascript - 使用父级 React 元素的 this.props 重复子级

ios - 是否可以使用 startMonitoringForRegion : and retrieve a correct version/copy of it later with monitoredRegions 存储 CLRegion 的子类

ios - 从概念上讲,子类化 UIView 是否正确?

php - MySQL 查询父子

php - Elasticsearch查询日期排序父子关系(重复事件)

objective-c - 在不使用访问器的情况下为继承的属性设置默认值

redirect - MVC 5 - 从任何地方重定向到 Controller

c# - 运算符作为 C# 中的方法参数

.net - C# 中的扩展方法重载,它有效吗?