一、
1.继承
父类需要open才可以被继承
父类方法、属性需要open才可以被覆写
接口、接口方法、抽象类默认都是open
覆写父类(接口)成员需要override关键字
举例:
子类D需要继承A父类,实现B、C接口
class D: A(),B,C
注意继承类时实际上调用了父类的构造方法
类只能单继承,接口可以多实现
2.接口代理:凡事不必事必躬亲,关键字by
class Manager(driver: Driver): Driver by driver
接口方法的实现交给代理类去实现
3.首先来看一个医生和程序源的例子 
再看一段代码
package net.println.kotlin.chapter4
/**
* @author:wangdong
* @description:医生和程序员的故事
*/
/**
* 一个类想要被继承,必须先open
* 一个方法想要被覆写,也必须先open
* open class Person{
* open fun work()
}
*/
/**定义一个人的抽象类*/
abstract class Person(open val age: Int){
abstract fun work()
}
/**定义一个工程师的类,继承人的抽象类*/
class engineer(age: Int): Person(age){
override val age: Int
get() = 0
//覆写方法一定要加override关键字
override fun work() {
println("我在写代码")
}
}
/**定义一个医生的类,继承人的抽象类*/
class doctor(age: Int): Person(age){
override fun work() {
println("我在给病人做手术")
}
}
fun main(args: Array<String>) {
val engineer = engineer(23)
engineer.work()
println("工程师" + engineer.age)
val doctor = doctor(45)
doctor.work()
println("医生" + doctor.age)
}
二、再看一资深经理的例子啦
package net.println.kotlin.chapter4
/**
* @author:wangdong
* @description:定义一个会开车的经理
*/
/**定义个一个经理*/
class Manager:Driver,Writer{
override fun drive() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun write() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
/**定义一个资深的经理,实现两个接口*/
/**接口代理Driver by driver,不用在覆写方法,类似write的覆写也可*/
class SeniorManager(var driver: Driver,var writer: Writer): Driver by driver,Writer{
override fun write() {
writer.write()
}
}
/**司机:资深经理需要找一个会开车的*/
class CarDriver: Driver{
override fun drive() {
println("给资深经理开车")
}
}
/**秘书:资深经理需要找一个会作ppt的*/
class PPTWriver: Writer{
override fun write() {
println("给资深经理做ppt")
}
}
/**定义一个开车的接口*/
interface Driver{
fun drive()
}
/**会写总结报告*/
interface Writer{
fun write()
}
fun main(args: Array<String>) {
//Hr给资深经理招司机、秘书
val driver = CarDriver()
val secretary = PPTWriver()
//给资深经理配一个司机、一个,秘书
val seniorManager = SeniorManager(driver,secretary)
//实际上是,资深经理让司机开车、让秘书做ppt
seniorManager.drive()
seniorManager.write()
}
/**运行结果是*/
/**
* 给资深经理开车
* 给资深经理做ppt
*/