我的Kotlin学习之旅(五)

学完了函数,就不得不提接口,在Java中,由于只能单继承(extends),很多拓展的功能就必须使用接口来实现。
例如在Android的mvp模式中,需要展示的界面(activity或者fragment)需要的网络数据,一般都是通过实现特定的view来获得从服务器获取的数据。这里的特定view就是一个接口,接口里面可以是抽象的方法或者方法的实现,如果是抽象方法,实现view的地方需要实现view的方法。

接口
在Kotlin中的接口和Java中的类似。接口也是用interface关键字来标识。
关于接口的属性:可以在接口中申明属性。接口中的属性要么是抽象的,要么提供访问器的实现

interface MyInterface {
    //抽象的属性
    val por: Int
    //提供了访问器的实现
    val sex: String
        get() = "test()"

    fun test(): String {
        return "man"
    }
}

接口的实现
一个类或者对象可以实现多个接口,用于解决Java中的单继承问题。

class MyInterImpl: MyInterface {
    override val por: Int
        get() = 10

    override val sex: String
        get() = super.sex

    override fun test(): String {
        return super.test()
    }
}

重写冲突问题
先看一下下面的这一段代码:

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()
    }
}

这里有两个接口AB,类C实现A,类D实现AB。
先看一下类C,由于A中有一个抽象方法 bar(),所以C中必须重写该方法,而方法foo()不是抽象的,可以不重写。
再看一下类D,它同时实现了AB两个接口,A的bar()方法是抽象的,但是B中的bar()方法不是抽象的,这里的D就不需要再复写bar()方法,因为B接口已经实现了该方法。(文档上是这么说的)
然而!然而!然而!我在试验的时候,代码报错提示:

class'D' must override public abstract fun bar(): Unit defined in com.ckw.zfsoft.testdemo.A because it inherits multiple interface methods of it

说的是D类必须重写bar()方法,所以D类需要这样写:

class D : A, B {

    override fun bar() {
    }

    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }
}

这个小插曲告诉我们,文档有时候并一定都是对的,有可能是Kotlin升级了之后,有些规则不再适用,所以还是要自己去积极地尝试!
好了,关于接口就学到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值