接口

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

interface InputDevice {fun input(event: Any)
}

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

interface InputDevice {//val version: String = "default" // IDE报错:Property initializers are not allowed in interfacesval version: String // 相当于定义getVersion()和setVersion()方法,但它不是属性,因为接口没有状态...
}

接口没有构造器,因此无法像类那样实例化,必须由类对其进行实现后使用:

fun main() {// val inputDevice = InputDevice() // IDE报错:Interface InputDevice does not have constructorsval 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" -> falseelse -> false}}
}

类继承需要使用 : 来连接,注意,因为抽象类同普通类一样拥有构造器(不管有无构造参数),所以实现抽象类时需要带 ()

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

fun main() {// val mouse = USBMouse() // IDE报错:Cannot create an instance of an abstract classval 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()
}

可以使用 接口或抽象类变量 接收 实现类实例。

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

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

Kotlin - 面向对象之抽象类与接口相关推荐

  1. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

    Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...

  2. Java面向对象编程——抽象类和接口

    Java面向对象编程--抽象类和接口 定义类的过程就是抽象和封装的过程,而抽象类与接口则是对实体类进行更高层次的抽象,进定义公共行为和特征. 抽象类: 如果一个类没有足够的信息去描述一个具体的对象,那 ...

  3. Java面向对象之抽象类与接口

    Java面向对象之抽象类与接口 ⚡️前言⚡️ 本篇文章为面向对象部分的第三篇文章,前两篇文章见链接包和继承.组合与多态.抽象类和接口都是继承关系中父类的更进一步,结合前两篇文章来阅读更易理解掌握.

  4. Java面向对象(2).抽象类和接口

    抽象类(abstract没有足够的信息来描述) 被abstract修饰的类就是抽象类,修饰的方法就是抽象方法. 抽象类中可以没有抽象方法,但有抽象方法的类必须要声明为抽象类. 抽象类不能使用new来创 ...

  5. 【面向对象】抽象类和接口

    目录 1. 抽象类的特点 2. 接口的特点 3. 抽象类和接口的区别 1. 抽象类的特点 抽象类可以有构造方法,但不能直接使用new调用构造方法进行实例化.需要通过非抽象子类的new,来间接的调用父类 ...

  6. kotlin面向对象之抽象类、继承、多态

    继承: 比较简单,直接看如何使用,这里以父亲与儿子的关系为例: 接着定义儿子并且继承父亲,如下: 是用":"号来继承的,但是此时报错了,看下错误提示: 在kotlin的类并非是人人 ...

  7. Java面向对象程序设计(抽象类和接口-----)

    接口 在Java语言中,仅支持单一继承,即一个子类只能有一个直接的父类,然而在日常生活中,多继承的问题在所难免 如电子书既是一种图书,同时又是一种多媒体,这种继承关系要求子类继承多个父类.这样就可能导 ...

  8. 【JAVA百炼成仙】化神篇 下——面向对象(抽象类、接口)

  9. 《Java技术》第三次作业--面向对象——继承、抽象类、接口

    1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandparen ...

最新文章

  1. 【Python 13】分形树绘制1.0--五角星(turtle库)
  2. 一个对象的内存图及运行流程和3个对象的内存图的运行流程
  3. jQuery对html元素取值与赋值
  4. 目标检测--Selective Search for Object Recognition(IJCV, 2013)
  5. Linux下超简单的Mysql自动备份+定期删除之前备份文件脚本
  6. Node JS和MongoDB的集成简单示例
  7. 刚刚!腾讯宣布扩招8000人,算法岗成最大亮点!
  8. 使用cfssl生成证书时报json: cannot unmarshal object into Go value of type []csr.Name错误
  9. 电子地图“顽疾”难治,会“传染”自动驾驶专用高精地图吗?
  10. IDEA 2019 激活码(注册码)
  11. 区块链上的中国?2018见分晓
  12. 房贷收入证明是月供的几倍?
  13. Matlab-信号系统笔记
  14. WebView 正确设置cookie 的方法
  15. 用户体验要素:以用户为中心的产品设计
  16. R语言及RStudio下载安装
  17. 管理软件 食品检测 药品检测 专业化的管理软件设计与实施11 员工管理 python
  18. 简单的dnf增幅模拟器
  19. 中国联通SP业务接入开发总结SGIP1.2 协议
  20. (转载) 如何定义一个号的变量名

热门文章

  1. 对抗苹果隐私新规?iOS应用1个月没更新 谷歌回应了
  2. UGUI源码解析——ContentSizeFitter
  3. UVA - 10306 e-Coins
  4. UVa 10306. e-Coins
  5. QQ留言代码,网页QQ留言
  6. Doris入门到精通-阶段一(简介安装使用)
  7. 高层次综合综述:FPGA HLS Today Successes, Challenges, and Opportunities
  8. 1-计算机是如何工作的?
  9. Lambda和Stream流
  10. ByVal与ByRef的区别