对象的快速inheritance和接口的含义

我在Kotlin中find: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 } 

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

 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) { println(ball.color) // no ball.play() here then why the interface in the example ??? } 

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

从这个接口inheritance可能只是在这里添加,所以这个例子的目的是显示如何将构造函数parameter passing给一个超类也可以炫耀从多种typesinheritance很快。 或者至少这是我从随附的文本中收集的内容:

如果超types有一个构造函数,则必须传递适当的构造函数参数。 许多超types可能被指定为冒号后的逗号分隔列表。


为了解决在这里不能使用创建的object作为B (或Toy )的问题:这不会使得语言特征无用,因为创建的object仍然可以通过其多个接口通过强制转换来使用。 例如,在你的例子中,你可以这样做:

 (ball as Toy).play() 

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

您已经创建了一个从类Ballinheritance的匿名类的实例,同时实现了接口Toy

但是,这两种types都是排他性的,即。 Ball不是Toy (在你的例子中),所以你不能在对Ball的引用上调用play()