一. 多态的基本要素
- 有一个父类(有接口)
- 有子类(实现了父类的全部方法)
- 父类类型的变量(指针)指向(引用)子类的具体数据变量
首先,定义一个父类
//本质是一个指针
type AnimalIF interface {
Sleep()
GetColor() string
GetType() string
}
其次,有一个子类
//具体的类
type Cat struct {
color string
}
func (this *Cat) Sleep() {
fmt.Println("Cat is Sleep")
}
func (this *Cat) GetColor() string {
return this.color
}
func (this *Cat) GetType() string {
return "Cat"
}
最后,是赋值
animal.Sleep()//多态
animal = &Cat{"Green"}
animal.Sleep()
完整例子:
package main
import "fmt"
//本质是一个指针
type AnimalIF interface {
Sleep()
GetColor() string
GetType() string
}
//具体的类
type Cat struct {
color string
}
func (this *Cat) Sleep() {
fmt.Println("Cat is Sleep")
}
func (this *Cat) GetColor() string {
return this.color
}
func (this *Cat) GetType() string {
return "Cat"
}
func main() {
var animal AnimalIF //接口的数据类型
animal = &Cat{"Green"}
animal.Sleep() //调用的是cat的sleep方法
}
当然,也可以这么写:
package main
import "fmt"
//本质是一个指针
type AnimalIF interface {
Sleep()
GetColor() string
GetType() string
}
//具体的类
type Cat struct {
color string
}
func (this *Cat) Sleep() {
fmt.Println("Cat is Sleep")
}
func (this *Cat) GetColor() string {
return this.color
}
func (this *Cat) GetType() string {
return "Cat"
}
type Dog struct {
color string
}
func (this *Dog) Sleep() {
fmt.Println("Cat is Sleep")
}
func (this *Dog) GetColor() string {
return this.color
}
func (this *Dog) GetType() string {
return "Cat"
}
func showAnimal(animal AnimalIF) {
animal.Sleep()//多态
fmt.Println("color =",animal.GetColor())
fmt.Println("kind = ",animal.GetType())
}
func main() {
cat := Cat{"Green"}
dog := Dog{"Yellow"}
showAnimal(&cat)
showAnimal(&dog)
//
//var animal AnimalIF //接口的数据类型
//animal = &Cat{"Green"}
//animal.Sleep() //调用的是cat的sleep方法
}