【问题标题】:Object quick inheritance and Interface meaning对象快速继承及接口含义
【发布时间】:2018-03-13 20:19:56
【问题描述】:

我在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 ???
}

【问题讨论】:

    标签: object inheritance interface kotlin delegation


    【解决方案1】:

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

    但是,这两种类型都是排他的,即。 Ball 不是 Toy(在您的示例中),因此您不能在对 Ball 的引用上调用 play()

    【讨论】:

      【解决方案2】:

      你是对的,如果A(或Ball)没有实现它,接口B(或者在你的例子中,Toy)将不能通过这个引用直接访问。

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

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


      解决无法将创建的object 用作B(或Toy)的问题:这不会使语言功能无用,因为创建的object 仍然可以通过铸造通过其多个接口使用。例如,在您的示例中,您可以这样做:

      (ball as Toy).play()
      

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

      【讨论】:

        猜你喜欢
        • 2015-07-05
        • 2014-12-24
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 2015-10-16
        相关资源
        最近更新 更多