Kotlin教程笔记(11) - 面向对象之抽象类与接口

简介: 本系列教程笔记详细讲解了Kotlin语法,适合深入学习。若需快速掌握Kotlin,建议查阅“简洁”系列教程。本文重点介绍了Kotlin中的抽象类与接口,包括接口的定义、实现、继承,以及抽象类的定义、构造器、方法实现等关键概念。

本系列学习教程笔记属于详细讲解Kotlin语法的教程,需要快速学习Kotlin语法的小伙伴可以查看“简洁” 系列的教程

快速入门请阅读如下简洁教程:
Kotlin学习教程(一)
Kotlin学习教程(二)
Kotlin学习教程(三)
Kotlin学习教程(四)
Kotlin学习教程(五)
Kotlin学习教程(六)
Kotlin学习教程(七)
Kotlin学习教程(八)
Kotlin学习教程(九)
Kotlin学习教程(十)

Kotlin教程笔记(11) - 面向对象之抽象类与接口

Kotlin - 面向对象之抽象类与接口

接口

接口是一种约定或协议,需要使用 interface 定义:

interface InputDevice {
fun input(event: Any)
}
接口不能有状态,我们可以在接口中声明一个类似"属性"的变量 x,但它并不是一个属性,相当于只是声明 getX/setX 方法:

interface InputDevice {
//val version: String = "default" // IDE报错:Property initializers are not allowed in interfaces
val version: String // 相当于定义getVersion()和setVersion()方法,但它不是属性,因为接口没有状态
...
}
接口没有构造器,因此无法像类那样实例化,必须由类对其进行实现后使用:

fun main() {
// val inputDevice = InputDevice() // IDE报错:Interface InputDevice does not have constructors

val myInputDevice = MyInputDevice("1.0")
myInputDevice.input("")

}

class MyInputDevice(override val version: String) : InputDevice {
override fun input(event: Any) {
println("010101010101010101001010101010....")
}
}
实现接口需要使用 : 来连接,注意,因为接口没有构造器,所以实现接口时不需要带 ()。

接口之间是可以继承的,子接口将拥有父接口的所有方法:

// USB输入设备
interface USBInputDevice : InputDevice
// 蓝牙输入设备
interface BLEInputDevice : InputDevice
另外,在 Kotlin 中接口方法可以默认实现:

interface InputDevice {
...
fun onLowPower() {
println("注意:当前电量低")
}
}
与 Kotlin 不同,Java 中的接口不支持默认实现。

抽象类

抽象类可以理解为是实现了一部分协议的半成品,需要使用 abstract class 定义:

abstract class USBMouse(val name: String, override val version: String = "1.0") : USBInputDevice {

override fun input(event: Any) {
    println("x , y ... ")
}

fun click(key: String) {
    println("点击了 $key 键")
}

abstract fun isSupport(os: String): Boolean

}
可以看到,抽象类是有构造器的,构造器中的 val 或 var 参数会变成成员属性,也就是说抽象类可以有状态。抽象类 USBMouse 实现了 USBInputDevice 接口,并实现了 input()方法,说明抽象类可以有方法实现。当然了,抽象类中方法实现不依赖于接口,它本身就可以像类那样定义自己的方法,如 click()。甚至它也可以像接口那样定义没有方法体的抽象方法 isSupport(),由具体子类去实现:

class LogitechMouse : USBMouse("罗技鼠标") {
override fun isSupport(os: String): Boolean {
return when (os) {
"windows" -> true
"MacOS" -> true
"iOS" -> false
else -> false
}
}
}
类继承需要使用 : 来连接,注意,因为抽象类同普通类一样拥有构造器(不管有无构造参数),所以实现抽象类时需要带 ()。

抽象类无法直接实例化,必须要子类继承后使用:

fun main() {
// val mouse = USBMouse() // IDE报错:Cannot create an instance of an abstract class
val mouse = LogitechMouse()
if (mouse.isSupport("windows")) {
mouse.click("left")
}
}

单继承多实现

Kotlin 不支持多继承!但支持多实现!比如,罗技 M720 鼠标本质是罗技鼠标,拥有 USB 和 BLE 两种连接功能:

class LogitechM720 : LogitechMouse(), USBInputDevice, BLEInputDevice {}

fun main() {
val usbInputDevice: USBInputDevice = LogitechM720()
val bleInputDevice: BLEInputDevice = LogitechM720()
val usbMouse: USBMouse = LogitechM720()
val logitechMouse: LogitechMouse = LogitechM720()
}
可以使用 接口或抽象类变量 接收 实现类实例。

抽象类和接口的共性与区别

共性 比较抽象,不能直接实例化
有需要子类(实现类)实现的方法
父类(接口)变量可以接收子类(实现类)的实例赋值
区别 抽象类有状态,接口没有状态
抽象类有方法实现,接口只能有无状态的默认实现
抽象类只能单继承,接口可以多实现
抽象类反映本质,接口体现能力

相关文章
|
19天前
|
Java 编译器 Kotlin
Kotlin入门笔记1 - 数据类型
Kotlin入门笔记1 - 数据类型
67 15
|
21天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
36 2
|
21天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
21 2
|
21天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
37 0
|
1月前
|
Java 物联网 Kotlin
Kotlin - 面向对象之抽象类与接口
Kotlin - 面向对象之抽象类与接口
|
22天前
|
Java 物联网 Kotlin
Kotlin教程笔记(11) - 面向对象之抽象类与接口
Kotlin教程笔记(11) - 面向对象之抽象类与接口
24 2
|
1月前
|
Java 物联网 Kotlin
Kotlin教程笔记(11) - 面向对象之抽象类与接口
Kotlin教程笔记(11) - 面向对象之抽象类与接口
65 9
|
1月前
|
Java 物联网 Kotlin
Kotlin - 面向对象之抽象类与接口
Kotlin - 面向对象之抽象类与接口
50 5
|
1月前
|
Java 物联网 Kotlin
Kotlin - 面向对象之抽象类与接口
Kotlin - 面向对象之抽象类与接口
21 5
|
1月前
|
Java 物联网 Kotlin
Kotlin教程笔记(11) - 面向对象之抽象类与接口
Kotlin教程笔记(11) - 面向对象之抽象类与接口