我们来定义一个接口,new一个Kotlin Interface,名字为IMan
interface IMan {
fun joyride()
}
然后新建一个Man类,实现刚才的IMan接口
class Man:IMan {
override fun joyride(){
println("我在飙车")
}
}
编写测试代码
fun main(args: Array<String>) {
var man = Man()
man.joyride();
}
查看运行结果
也可以这样写,执行结果相同,这样是面向接口编程,也可以称为多态
fun main() {
val man = Man();
doJoyride(man)
}
fun doJoyride(iMan: IMan){
iMan.joyride()
}
接口中对函数可以进行默认实现,我们默认实现了 joyride 这个函数,没有实现 readBooks
interface IMan {
fun joyride(){
println("我在飙车")
}
fun readBooks()
}
当 Man 这个类去实现 IMan 这个接口时,指挥强制要求实现 readBooks() 函数了,joyride() 可以选择实现或不实现
class Man:IMan {
override fun readBooks() {
TODO("Not yet implemented")
}
}
感觉跟抽象类的用法很像,接口和抽象类的区别是什么呢,我们再举例说明下
interface IMan {
fun joyride()
}
abstract class Human() {
abstract fun eat()
}
class Man:Human(),IMan {
override fun joyride(){
println("我在飙车")
}
override fun eat(){
println("我在吃饭")
}
}
编写测试代码
fun main(args: Array<String>) {
var man = Man()
man.joyride();
man.eat()
}
查看运行结果
但是对于无车一族来说,就没办法飙车,无车一族是人类Human,但是不能实现IMan接口,因为他没有车,不具备飙车能力
class NoCarMan:Human() {
override fun eat(){
println("无车一族只能吃饭,不能飙车")
}
}
编写测试代码
var man2 = NoCarMan()
man2.eat()
运行结果
我们来对比下
fun main(args: Array<String>) {
var man = Man()
var man2 = NoCarMan()
var list = listOf<Human>(man,man2)
for(p in list){
p.eat()
}
}
如果我们将for循环修改下
for(p in list){
if(p is Man){
p.eat()
}
}