对象快速继承和接口意义

时间:2017-10-02 17:53:37

标签: object inheritance interface kotlin delegation

我在Kotlin: Object文档中找到了一个示例:

open class A(x: Int) {
    public open val y: Int = x
}

interface B {...}

val ab: A = object : A(1), B {
    override val y = 15
}

所以我用更有意义的名称实现了这个例子,我不知道逗号分隔的超类型列表与对象之间的接口是什么原因?

interface Toy {
    fun play () {
        println("Play, play....")
    }
}

open class Ball(public open val color: String = "red") {}

val ball: Ball = object : Ball(), Toy {
    override val color : String = "blue"
    override fun play() {
        println("Bounce, bounce...")
    }
}

fun main(args: Array<String>) {
    println(ball.color)
    // no ball.play() here then why the interface in the example ???
}

2 个答案:

答案 0 :(得分:1)

您更正了,如果B(或Toy,则无法通过此引用直接访问界面A(或您的示例Ball) )没有实现它。

可能只是在这里添加了从该接口的继承,因此这个示例旨在显示构造函数参数如何传递给超类也可以非常快速地显示从多个类型继承。或者至少从我附带的文本中收集到的内容:

  

如果超类型具有构造函数,则必须将适当的构造函数参数传递给它。可以在冒号后将许多超类型指定为以逗号分隔的列表。

要解决此处无法将创建的object用作B(或Toy)的问题:这并不会使语言功能失效,因为创建的object仍然可以通过转换通过其多个接口使用。例如,在您的示例中,您可以执行此操作:

(ball as Toy).play()

或者在原始示例中,您可以创建类型Any,然后根据需要转换为不同的接口。

答案 1 :(得分:0)

您创建了一个匿名类的实例,该类继承自类Ball,同时实现了接口Toy

但是,这两种类型都是排他性的,即。 Ball不是Toy(在您的示例中),因此您无法在play()的引用上致电Ball