23. 面向对象-继承

作者: 厚土火焱 | 来源:发表于2017-11-18 18:02 被阅读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()
    }
    

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

    开车呢
    写稿子呢
    

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

    相关文章

      网友评论

        本文标题:23. 面向对象-继承

        本文链接:https://www.haomeiwen.com/subject/mqzevxtx.html