Kotlin 学习笔记(八)—— Kotlin类与对象之接口


Kotlin学习笔记系列教程

Kotlin 学习笔记(一)—— 概述、学习曲线、开发工具、参考资料
Kotlin 学习笔记(二)—— 基础语法
Kotlin 学习笔记(三)—— 习惯用法
Kotlin 学习笔记(四)—— Kotlin基础之基本类型
Kotlin 学习笔记(五)—— Kotlin基础之控制流、返回与跳转、 包与导入
Kotlin 学习笔记(六)—— Kotlin类与对象之类和继承
Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段


接口

Kotlin 的接口和 Java8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存柱状。它可以有属性但必须声明为抽象或提供访问器实现。

使用关键字 interface 来定义接口

1
2
3
4
5
6
7
interface A {
fun setName()
fun setAge(){
//可选方法体
}
}

实现接口

一个类或者对象可以实现一个或多个接口。

1
2
3
4
5
class B : A {
override fun setName() {
}
}

接口中的属性

你可以在接口中定义属性。在接口中声明的属性要么是抽象的,要么提供访问器的实现,在接口中声明的属性不能有幕后字段,因此接口中声明的访问器不能引用它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface A {
val time:Int
var name:String
get() = "aaa"
set(value) {
}
fun setName()
fun setAge(){
//可选方法体
}
}
class B : A {
override val time: Int
get() = 5
override fun setName() {
}
}

解决覆盖冲突

实现多个接口或继承父类时,可能会遇到同一方法继承多个实现的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface A {
fun foo() { print("A") }
fun bar()
}
interface B {
fun foo() { print("B") }
fun bar() { print("bar") }
}
class C : A {
override fun bar() { print("bar") }
}
class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
override fun bar() {
super<B>.bar()
}
}

接口 A 和 B 都定义了方法 foo() 和 bar(),两者都实现了foo(),但是只要 B 实现了bar(),bar()在 A 中没有标记为抽象,因为没有方法体时默认为抽象。因为 C 实现了 A 的具体类,所以必须重写 bar() 并实现这个抽象方法。

然而,如果我们从 A 和 B 派生 D,我们需要实现我们从多个接口继承的所有方法,并指明 D 应该如何实现它们。这一规则既适用于继承单个实现(bar())的方法也适用于继承多个实现(foo())的方法。


以上就是类与对象第三篇之接口,第四篇将学习可见性修饰符


个人博客地址:http://outofmemory.top/
CSDN地址:http://blog.csdn.net/dazhaoDai
GitHub地址:https://github.com/dazhaoDai


文章目录
  1. 1. Kotlin学习笔记系列教程
  • 接口
    1. 1. 实现接口
    2. 2. 接口中的属性
    3. 3. 解决覆盖冲突
  • |