kotlin精讲-第3章(7)抽象类

作者: 739c8d412b4c | 来源:发表于2017-12-06 09:08 被阅读167次

    抽象类定义

    我们之前说“人会尿尿,男人是站着尿尿,女人是蹲着尿尿”,在基类人(Person)中定义了尿尿的方法(niaoniao),但其实基类人(Person)不知道怎么定义尿尿的行为,站着也不行,蹲着也不是,应该交给子类男人(Man)、子类女人(Woman)具体去定义尿尿行为。

    在程序世界里面,基类中某个方法,基类不知道具体实现,需要交给子类去具体实现,我们可以把这个方法定义为抽象方法。那怎么把方法变成抽象方法呢?去掉方法体,方法上加上abstract关键字即可,类似这样:

    一个类如果包含了抽象方法,那么这个类需要变成抽象类。那怎么把类变成抽象类呢?类的前面,加上abstract关键字即可,类似这样:


    抽象类实现

    基本实现

    我们把“人会尿尿,男人是站着尿尿,女人是蹲着尿尿”这样的例子,通过抽象类和抽象方法实现一下,参考代码:

    针对以上代码只是把niaoniao方法改成了抽象方法,Person类改成了抽象类,其他没有改变。

    可包含方法实现

    但是抽象类,可包含方法实现,类似这样也是可以的:

    我们对上面代码做相应修改,参考代码:

    不能被实例化

    抽象类不能被实例化,只能作为基类,被其他类所继承。我们通过代码验证下,参考代码:

    子类必须实现抽象方法或者变成抽象类

    一个类继承了抽象类,要么实现所有的抽象方法,要么再把自身变成抽象类。抽象类可以包含非抽象方法。参考代码:

    我们看到Man没有实现niaoniao的方法,就需要通过abstract关键字继续把类变成抽象类。

    抽象方法必须public或者protected(默认就是)

    抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。参考截图:

    可包含属性

       抽象类,还可以包含抽象属性,也就是通过**abstract**关键字修饰的属性,如果抽象类中含有抽象属性,子类中必须将抽象属性初始化,除非子类也为抽象类。参考代码:
    

    【代码清单-抽象类6可包含属性_子类必须实现或者变成抽象方法.kt】

    属性不可实例化

    虽然,抽象类可以包含属性,但是只能包含属性的定义,属性不能实例化,参考截图:

    【抽象类7可包含属性_属性不能实例化.kt】

    a

    相关文章

      网友评论

        本文标题:kotlin精讲-第3章(7)抽象类

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