说到继承。先来看下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