Golang中的接口,提供了类似于C++中多态的功能,比如接口提供了一个功能为 “跑步”,人类可以跑步,机器人也可以跑步。只要你定义的class,实现和接口中一样的函数名(参数必须是一样的),在具体实现你定义类中和接口一样的名称和参数的函数,就可以实现同一个跑步的功能,可以是人也可以是机器人。具体的功能实现主要在于你的class中的成员方法。
package main
import (
"fmt"
"os"
"reflect"
)
type MRun interface { //接口的定义
MRun(from string,to string)
}
func TakeRide(from,to string,mrun MRun) { //接口的对应的公共函数
switch v:= mrun.(type) {
case *Human:
fmt.Fprintf(os.Stdout," ----->Human %s<-----\n",v)
case *Robot:
fmt.Fprintf(os.Stdout," ----->Robot %s<------\n",v)
default:
fmt.Fprintf(os.Stdout," ----->Unkown %s<------\n",v)
}
mrun.MRun(from,to)
}
type Human struct{ //class的定义,定义了一个人类
name string
}
func (p *Human) MRun(from string,to string) { //与接口函数和参数一样的人类的方法
fmt.Fprintf(os.Stdout,"I am %s(type = %s) ,run from %s to %s\n",p.name,reflect.TypeOf(*p),from,to)
}
type Robot struct{
name string
}
func (p *Robot) MRun(from string,to string){//与接口函数和参数一样的机器人的方法
fmt.Fprintf(os.Stdout,"I am %s(type = %s) ,run fromom %s to %s\n",p.name,reflect.TypeOf(*p),from ,to)
}
func main() {
man := &Human{"joy"}
rot := &Robot{"inner"}
var from string = "shanghai"
var to string = "beijing"
TakeRide(from,to,man)
TakeRide(from,to,rot)
}
运行结果: