Kotlin面向对象之接口(Interfaces)

Kotlin中的接口非常类似于Java 8。它们可以包含抽象方法,以及抽象方法的实现。它们与抽象类不同之处在于接口不能存储状态。 它们可以具有属性,但是需要被声明为抽象的,或提供访问器的实现。

接口的定义需要使用interface关键字:

interface MyInterface {
    fun bar()
    fun foo() {
      // optional body
    }
}

接口的实现(Implementing Interfaces)

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

class Child : MyInterface {
    override fun bar() {
        // body
    }
}

接口中的属性(Properties in Interfaces)

可以在接口中声明属性。在接口中声明的属性可以是抽象的,也可以为访问器提供实现。 在接口中声明的属性不能具有后备字段,因此在接口中声明的访问器不能引用后备字段:

interface MyInterface {
    val prop: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

重载冲突的解决(Resolving overriding conflicts)

当我们的基类列表(要继承或实现的)存在多个基类(父类或接口)的时候,可能会出现我们继承同一方法的多个实现的情况。 例如:

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中没有标记为abstract,但接口中的方法如果没有方法体的话默认是abstract的)。现在,如果我们从A导出一个具体的类C,我们显然必须重写bar()并提供一个实现。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,486评论 9 118
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,919评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,397评论 18 399
  • 我走过南,也走过北 走过夜深,也走过黑 我常路过你的河 也学会了你唱的山歌 我骑马也驾车 我行头里都是你的歌 它陪...
    扭一扭舔一舔阅读 1,189评论 0 3

友情链接更多精彩内容