Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object 对象快速继承与接口含义_Object_Inheritance_Interface_Kotlin_Delegation - Fatal编程技术网

Object 对象快速继承与接口含义

Object 对象快速继承与接口含义,object,inheritance,interface,kotlin,delegation,Object,Inheritance,Interface,Kotlin,Delegation,我在文档中找到了一个例子: 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

我在文档中找到了一个例子:

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 ???
}
接口玩具{
趣味游戏(){
println(“播放,播放…”)
}
}
开放类球(public open val color:String=“red”){}
val ball:ball=对象:ball(),玩具{
覆盖val颜色:String=“蓝色”
玩乐{
println(“反弹,反弹…”)
}
}
趣味主线(args:Array){
println(球颜色)
//这里没有ball.play(),那么为什么示例中的接口是???
}

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


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

您是正确的,如果
A
(或
Ball
)未实现,则无法通过此引用直接访问接口
B
(或在您的示例中,
Toy

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

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


为了解决无法将创建的
对象
用作
B
(或
玩具
)的问题,这里:这并不会使语言功能无效,因为创建的
对象仍然可以通过其多个接口通过强制转换使用。例如,在您的示例中,您可以执行以下操作:

(ball as Toy).play()
或者在最初的示例中,您可以将类型设置为Any
,然后根据需要转换为不同的接口