Kotlin学习(11)→抽象类、接口、接口代理


在期待着郭霖先生的《第一行代码(第三版)》时,意识到自己需要补充必要的Kotlin知识,现在通过写博客进行分享,争取拿到书之后早日上手。
使用的软件是IDEA 2019,文章中如有错误或者欠缺的地方,欢迎批评指正。
(参考书为《Kotlin从零到精通Android开发》,欧阳燊著,清华大学出版社2018年4月第一版,ISBN 978-7-302-49814-8)。感谢欧阳先生的优秀教材。

1、抽象类

抽象类与普通的类的区别是,其中有被关键字abstract修饰的方法,被称之为抽象方法,相应的,这个类就成为了抽象类(也要声明为abstract)。抽象方法没有方法体,只是给出了参数列表和返回值,这个方法需要在抽象类的子类中实现。另外,因为抽象类是必须要继承才可以被子类用的,它自己无法构造对象,因此,抽象类的open关键字和抽象方法的open关键字可以省略。
根据之前写好的Animal类代码,准备好另一个抽象类,继承自Animal类,起名为Dog类:

abstract class Dog (name:String?,age:Int?, var voice:String?) : Animal(name,age) {
   
    init {
   
        voice="wang"
    }
    abstract fun callOut()
}

Dog类主构造函数中的name和age都是原Animal类的参数(不用带var或者val),又新增了一个成员变量voice。在Dog类的init函数中,为voice赋值为"wang"。
Dog类有一个抽象方法(抽象类也可以没有抽象方法,但这样就没什么意义了)callOut,我们的目的是为了输出狗的叫声。
接着准备好另一个类MaleDog,继承该抽象类,重写callOut方法:

class MaleDog (name:String?,age:Int?, voice:String?) : Dog(name,age,voice) {
   
    override fun callOut() {
   
        println(voice)
    }
}

注意,MaleDog类可以不把init方法写出来,系统默认就有init方法,因为MaleDog和父类Dog的参数列表一致,构造MaleDog对象时,调用的实际上是Dog的构造函数。如果要写init方法,也要注意父类的属性不能在子类的init方法中赋值,否则编译器报父类参数不能被再初始化错误。 父类的参数如果子类可见,则可以在子类的其他函数中修改。
callOut方法重写也很简单,注意这里override关键字需要加在fun关键字前面,重写的函数输出了voice。
可以自己尝试一下。
一般的,抽象类提供一个或多个抽象函数,不同的类都可以去继承这个抽象类,然后在自己的类中重写抽象类中的抽象函数,加入自己的逻辑,这样的做法是比较好的,体现出了继承的基本思想。

2、接口

Kotlin引入接口的思路和Java是类似的,即解决无法多重继承的问题,同时规避多重继承带来的各种问题。虽然Kotlin类是无法多重继承(即有多个父类),但是却可以继承多个接口。
什么是接口呢?接口其实功能上就相当于是抽象类,接口中可以有成员方法,可以有成员属性。这些与抽象类都是一致的。但是,抽象类中的属性默认是不抽象的,除非显式加入abstract关键字,否则在抽象类中声明的属性必须被初始化(不抽象)。

接口中所有属性、方法 都是可继承、抽象的,并且接口不能带构造函数(不然就成了类了)。接口采用关键字interface声明。同时,Kotlin的接口允许在接口内部实现方法。

在原来的Dog、MaleDog的基础上,准备一个接口ActionMethod,指定狗行动的方法,一种是走,另一种是跑,并让MaleDog继承。代码如下:

abstract class Dog (name:String?,age:Int?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值