0
点赞
收藏
分享

微信扫一扫

【16】kotlin 面向对象,继承 接口代理 by 与冲突解决 super


说到继承。先来看下java的继承

package com.yzdzy.kotlin.chapter4;

public class PersonJava {
public void work() {

}

public static class MaNong extends PersonJava {
@Override
public void work() {

}


}
}

@Override标签可写可不写。。

再来看kt的

package com.yzdzy.kotlin.chapter4

abstract class Person(open val age:Int) {
abstract fun work()
}

class MaNong(age:Int): Person(age) {
override val age: Int
get() {
return 0
}

override fun work() {
println("我是码农,我在写代码")
}
}

class Doctor(age:Int) : Person(age) {
override fun work() {
println("我是医生,我在给病人看病")
}
}

fun main(args: Array<String>) {
val person:Person = MaNong(23)
person.work()
println(person.age)

val person2:Person = Doctor(24)
person2.work()
println(person2.age)

}

1、必须要写  override 关键字。

2、 被abstract 或者open修饰的方法才能被重写

再看一个案例

经理都是自己做事情

package com.yzdzy.kotlin.chapter4

interface Driver {
fun drive()
}

interface Writer {
fun write()
}

class Manager : Driver, Writer {
override fun drive() {
TODO("Not yet implemented")
}

override fun write() {
TODO("Not yet implemented")
}
}

class SeniorManager(val driver: Driver, val writer: Writer) : Driver, Writer {
override fun drive() {
driver.drive()
}

override fun write() {
writer.write()
}

}

高级经理。拥有指示别人去做事情的能力

上面写法完全没有问题。。但是可以用by简化

改后代码

package com.yzdzy.kotlin.chapter4

interface Driver {
fun drive()
}

interface Writer {
fun write()
}

class Manager : Driver, Writer {
override fun drive() {
TODO("Not yet implemented")
}

override fun write() {
TODO("Not yet implemented")
}
}

class SeniorManager(val driver: Driver, val writer: Writer) : Driver by driver, Writer by writer {


}

by关键字 便可以简化复写与调用 如果方法没有内容{} 花括号也可以删除

高级经理找了一个司机和一个秘书

来帮忙开车和做ppt

package com.yzdzy.kotlin.chapter4

interface Driver {
fun drive()
}

interface Writer {
fun write()
}

class Manager : Driver, Writer {
override fun drive() {

}

override fun write() {

}
}

class SeniorManager(val driver: Driver, val writer: Writer) : Driver by driver, Writer by writer

class CarDriver:Driver{
override fun drive() {
println("开车呢")
}

}
class PPTWriter:Writer{
override fun write() {
println("做ppt呢")
}

}

fun main(args: Array<String>) {
val driver = CarDriver()
val writer = PPTWriter()

val senioManager =SeniorManager(driver,writer)
senioManager.drive()
senioManager.write()
}

下面来实际运行下上面代码

效果

开车呢
做ppt呢

 

当类与接口有同名方法且返回值一样 如何调用呢

package com.yzdzy.kotlin.chapter4.conflict

abstract class A {
open fun x(): Int = 5
}

interface B {
fun x(): Int = 1

}

interface C {
fun x(): Int = 0
}

class D(var y: Int = 0) : A(), B, C {

override fun x(): Int {
println("Call x() int in D")
if (y > 0) {
return y
} else if (y < -200) {
return super<C>.x()
} else if (y < -100) {
return super<B>.x()
} else {
return super<A>.x()
}

return 0
}


}

fun main(args: Array<String>) {
println(D(3).x())
println(D(-10).x())
println(D(-110).x())
println(D(-11000).x())
}

可以使用关键字 super<Class>.x()

继承(实现)语法要点

父类需要open 才可以被集成

父类方法属性 需要open 才可以被复写

接口、接口方法、抽象类 默认为open

复写父类(接口)成员 需要override关键字

集成语法class D:A(),b,c

注意继承类时实际调用了父类构造方法

类只能单集成,接口可以多实现

接口代理 by

class SeniorManager(val driver: Driver, val writer: Writer) : Driver by driver, Writer  by writer

接口方法实现交给代理类实现

接口方法冲突

 接口方法可以有默认实现

签名一直且返回值相同的冲突

解决方法 可以使用关键字 super<Class>.x()

举报

相关推荐

0 条评论