昨天写协成之后感觉协成的文章不是太好些要慢慢屡屡,因此今天折回来聊聊接口……
为啥会有接口呢?这个还要从继承说起,OOP的世界中继承这个东东太复杂了而目前C++依然保留这多继承的体系其余的大部分新兴的高级语言都舍弃了多继承,但是仅仅单继承又不符合OOP的概念体系,怎么办!!!于是接口应运而生---绕过多继承的坑,有能有多继承带来的好处……这些都是今天引入接口的引子,我们下面看看Kotlin接口带来哪些新的不同
1 接口中可以定义方法及方法体和属性
interface MyInterface{
//子类需要实现
fun sayHello()
//可以被子类覆写
fun hi(){
println("hi,gay")
}
//可以被覆写
val name:String
}
abstract class B:MyInterface{
override val name: String
get() = "B Name"
}
上栗中我们看到接口中可以定义属性变量和方法甚至可以直接实现方法体,这在Java中是不被允许的,当然了这个在swift中是第一的创新,也再次验证了Kotlin是另一版本的swift?
2接口继承
interface MySubInterface:MyInterface{
override fun sayHello() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
println("sub interface --sayHello")
}
override val name: String
get() {
return "MySubInterface"
}
}
class AA: MySubInterface{}
不错吧,Kotlin的接口继承还是很有意思的,可以完全吧class应有的功能全部搞定
3继承时的冲突问题
文章以开头我们就说了Kotlin可以实现多接口继承,那么当出现多接口中方法名重复如何处理呢?我们先看一个例子
interface C{
fun foo(){
println("C--->foo")
}
fun bar()
}
interface D{
fun foo(){
println("D---->foo")
}
fun bar(){
print("D---->bar")
}
}
例子中CD几口均实现里自己定义的方法foo,而bar接口只有在D中实现,C中的bar接口等待子类去实例化。例子设计的很全面既有重名的方法还有重名单有没有实现的方法
class E: C,D{
override fun foo() {
super<C>.foo()
super<D>.foo()
}
override fun bar() {
super.bar()
}
}
自理中对于foo的覆写我们补多少,而要想覆写时调用父类的方法foo则需要要指定调用哪个父类的foo方法从而区分出不同的类继承。而对于bar我们发现我们省略了声明父类的声明---因为C并没有实现bar的方法体也就无所谓调用父类的功能啦,当然了为了代码规范一致性我们还是可以把父类的声明给添加上super<D>.bar()