【Kotlin学习日记】Day10:接口

大家好,我是William李梓峰,欢迎加入我的Kotlin学习之旅。
今天是我学习 Kotlin 的第十天,内容是 Interfaces - 接口。

官方文档:

Interfaces - 接口

Interfaces in Kotlin are very similar to Java 8. They can contain declarations of abstract methods, as well as method implementations. What makes them different from abstract classes is that interfaces cannot store state. They can have properties but these need to be abstract or to provide accessor implementations.
Kotlin 的接口跟 Java 8 的很像。因为 Java 8 的接口除了有抽象方法以外,还可以写 default method(默认方法,这种机制为了避免一旦更新了接口就要强制让所有实现类都要实现新的方法,避免灾难的发生)。接口跟抽象类唯一不同的地方就是接口本身不可以存储状态,接口的属性要么是 abstract 的,要么需要开发者提供访问器(getter setter)的具体实现。

An interface is defined using the keyword interface{: .keyword }
用 interface 关键字去定义接口吧:

interface MyInterface {
    fun bar()
    fun foo() {                     // 不用像 Java 8 那样写 default 。。
      // optional body
    }
}

Implementing Interfaces - 实现接口

A class or object can implement one or more interfaces
跟 Java 一样,一个类可以实现多个接口。

class Child : MyInterface {    // 这种写法跟继承其实没有任何区别
    override fun bar() {
        // body
    }
}

Properties in Interfaces - 接口的属性(重点来了)

You can declare properties in interfaces. A property declared in an interface can either be abstract, or it can provide implementations for accessors. Properties declared in interfaces can't have backing fields, and therefore accessors declared in interfaces can't reference them.
你可以在接口里面声明属性。这个声明在接口里面的属性可以是抽象的,也可以提供一个具体的访问器实现(上面提过了)。但是,由于接口的属性即便有访问器也不可以拥有备用字段(Day 9 讲过备用字段,field 只能写在 setter getter 里面,field 的功能相当于对象的 this 一样),所以其访问器里面不可以调取 field。

interface MyInterface {
    val prop: Int // abstract           // 默认就有 open 光环照着

    val propertyWithImplementation: String
        get() = "foo"     // 我是接口属性的访问器,就是不可以调 field

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29    // override 就是复写接口属性的值
}

Resolving overriding conflicts - 解决复写的冲突

When we declare many types in our supertype list, it may appear that we inherit more than one implementation of the same method. For example
当我们在超类列表中声明多个类型的时候,也许会出现同名方法多种继承实现的情况(直接看代码吧,这段话有点不知所云),例如:

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()     // 显式调用 A 实现
        super<B>.foo()
    }

    override fun bar() {
        super<B>.bar()
    }
}

Interfaces A and B both declare functions foo() and bar(). Both of them implement foo(), but only B implements bar() (bar() is not marked abstract in A, because this is the default for interfaces, if the function has no body). Now, if we derive a concrete class C from A, we, obviously, have to override bar() and provide an implementation.
接口 A 和 接口 B 都声明了方法 “foo()” 和 “bar()”。两个接口都实现了方法 “foo()”,但是接口 B 实现了 “bar()” (bar() 没有在 接口 A 中标记为 abstract,因为它没有具体实现,所以默认就认为是抽象方法,跟 Java 的一样嘛)。现在,如果我们让类 C 实现接口 A,很明显,类 C 必须复写 “bar()” 方法,提供一个具体的实现。

However, if we derive D from A and B, we need to implement all the methods which we have inherited from multiple interfaces, and to specify how exactly D should implement them. This rule applies both to methods for which we've inherited a single implementation (bar()) and multiple implementations (foo()).
但是,如果我们让类 D 实现接口 A 和接口 B ,我们需要实现所有的方法,这些方法均继承于这些接口,并且指明类 D如何去实现。这些规则都适用于所有方法,无论是 “bar()” 还是 “foo()”。(这里讲的有点啰嗦了,实际上就是让类 D 直接复写所有的方法,这里的情况讲的有点复杂了,实际开发中基本没碰到实现不同接口的相同方法名的场景。)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 亲爱的负能量君, 你好呀。我真的是受宠若惊,你每次都千里迢迢、出其不意、攻其不备、一而再再而三地拜访我。不知何时起...
    花花骚年阅读 1,133评论 1 13
  • 作者全冠晶食用菌调理\潘映航 全冠晶食用菌/艾艾贴 选择要走的路很重要 每个人要走的路是不一样的,选择职业的时候也...
    短视频制作启航阅读 202评论 3 1
  • 渐渐成熟不知该高兴还是悲伤,伴之而来的是内心对贫穷的深刻感知,恰如切肤,谈不上疼痛,却如阴云般惨淡,长久地笼罩着,...
    书生亦百用阅读 216评论 0 1
  • 我是一只穿山甲,我的日常就是睡觉,抓蚂蚁,吃蚂蚁,一窝一窝的抓起来吃,嘎嘣嘎嘣的可香了。 所有的蚂蚁都见我就跑,不...
    胖嘟嘟的长颈鹿阅读 643评论 0 2