标签:实现 name else UNC fish import als package 属性
package main
import "fmt"
/*
定义动物接口:死、活着
定义动物实现类:鸟、鱼、野兽(跑、捕食)
继承野兽:实现老虎,实现人
业务场景:工作日所有动物都活着、周末人出来捕食,野兽逃跑,其它动物死光光
*/
type Animal interface {
Live()
Godie()
}
type BaseAnimal struct {
Name string
}
func (ba *BaseAnimal)Live() {
fmt.Printf("%s正在活着\n",ba.Name)
}
func (ba *BaseAnimal)Godie() {
fmt.Printf("%s狗带\n",ba.Name)
}
type Bird struct {
BaseAnimal
}
//鸟鱼兽继承BaseAnimal,少写大量通用的生死方法,同时还获得了Name属性
type Fish struct {
BaseAnimal
}
type Beast struct {
BaseAnimal
}
func (b *Beast)Run() {
fmt.Printf("野兽%s正在奔跑\n",b.Name)
}
func (b *Beast)Hunt() {
fmt.Printf("野兽%s正在捕食\n",b.Name)
}
type Tiger struct {
Beast
}
type Human struct {
Beast
}
func main() {
animals := make([]Animal, 0)
animals = append(animals, &Bird{BaseAnimal{"伯德"}})
animals = append(animals, &Fish{BaseAnimal{"尼莫"}})
animals = append(animals, &Tiger{Beast{BaseAnimal{"泰格"}}})
animals = append(animals, &Human{Beast{BaseAnimal{"大官人"}}})
for i:=1;i<=7 ;i++ {
fmt.Printf("今天星期%d:\n",i)
if i<=5{
for _,a:=range animals{
a.Live()
}
}else{
for _,a := range animals{
if human,ok := a.(*Human);ok{
human.Hunt()
}else if tiger,ok := a.(*Tiger);ok {
//断言为Beast是定位不到Tiger的,因为丢入容器时丢的是老虎对象,因此只能断言为老虎
tiger.Run()
}else{
a.Godie()
}
}
}
fmt.Println()
}
}
输出:
今天星期1: 伯德正在活着 尼莫正在活着 泰格正在活着 大官人正在活着 今天星期2: 伯德正在活着 尼莫正在活着 泰格正在活着 大官人正在活着 今天星期3: 伯德正在活着 尼莫正在活着 泰格正在活着 大官人正在活着 今天星期4: 伯德正在活着 尼莫正在活着 泰格正在活着 大官人正在活着 今天星期5: 伯德正在活着 尼莫正在活着 泰格正在活着 大官人正在活着 今天星期6: 伯德狗带 尼莫狗带 野兽泰格正在奔跑 野兽大官人正在捕食 今天星期7: 伯德狗带 尼莫狗带 野兽泰格正在奔跑 野兽大官人正在捕食
标签:实现 name else UNC fish import als package 属性
原文地址:https://www.cnblogs.com/yunweiqiang/p/11925686.html