Kotlin开发指南KotlinKotlin编程

23. 面向对象-继承

2017-11-18  本文已影响92人  厚土火焱

kotlin面向对象的继承,都继承些什么呢?
我们可以把一个类实例化成为一个对象。这个类从其父类可以继承一些东西,从而让这个对象拥有了其父类所具有的一些特点,比如属性和方法。
建立一个抽象类 Person,Person 有自身的属性 age。Person有一个自身的抽象方法 work。

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

Person有不同的子类,有码农有医生,于是

class CodeFarmer(age: Int):Person(age){
    override fun work() {
        println("我是码农,${age}岁了,我在写代码。")
    }
}

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

我们现在看到了两个人,一个码农,一个医生。让这两个人都各自去工作好了。

fun main(args: Array<String>) {
    val person:Person = CodeFarmer(45)
    person.work()
    val person2:Person = Doctor(50)
    person2.work()
}

运行一下,发现这两个人一边工作一边介绍自己。哈哈!

我是码农,45岁了,我在写代码。
我是医生,50岁了,我在给病人看病。

好吧,码农是个老码农,医生也是个老医生了。
如果只是这样的继承,没什么意义。我们让码农拥有一种能力,自己改变年龄属性。(为什么有这个能力?因为代码都能改变世界,改个年龄不在话下。)

class CodeFarmer(age: Int):Person(age){
    override val age:Int
    get() = 27
    override fun work() {
        println("我是码农,${age}岁了,我在写代码。")
    }
}

这个时候,码农拥有了自己的年龄的属性,可是代码确显示说有错误。


age在父类中是最终类型的报错提示

原来是父类 Person 中的 age 属性,它应当被设置为 open 才能够被继承和修改。于是我们也改一下 Person 类。

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

再运行代码,就发现,码农年轻了。这是因为科技让人做到了长生不老吗?哈哈!

我是码农,27岁了,我在写代码。
我是医生,50岁了,我在给病人看病。

再举一个例子。职场中,每个人都有自己的职责,司机负责驾驶,秘书负责写稿,而经理对司机和秘书进行管理和分配工作,形成整体的能力。
先看司机和秘书的类,首先他们分别是驾驶者和写手,我们用接口来代表这两种能力。

interface Driver{
    fun drive()
}
interface Writer{
    fun write()
}

然后司机和秘书分别继承这两个接口,具有相应的能力。

class CarDriver:Driver{
    override fun drive() {
        println("开车呢")
    }
}
class DraftWriter:Writer{
    override fun write() {
        println("写稿子呢")
    }
}

然后该这两位的经理上场了,他可以安排他们工作,相当与他们是经理的工作属性一样。但是,他们不是继承关系,因为,司机和秘书随时可以被新的司机和秘书顶替掉。他们只是经理的属性的扩展而已,那么经理这个类,只是继承了这两个类的属性。我们可以通过接口来实现。kotlin 本身也不允许继承多个类。

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

让他们工作的代码

fun main(args: Array<String>) {
    val driver = CarDriver()
    val writer = DraftWriter()
    val superManager = SuperManager(driver,writer)
    superManager.drive()
    superManager.write()
}

果然,司机和秘书的能力都被经理合并为集体的能力了。
运行结果

开车呢
写稿子呢

面向对象就是这样的。人生也是这样的。呵呵!

上一篇下一篇

猜你喜欢

热点阅读