GO语言面向对象06---面向对象练习01

package main

import "fmt"

/*
定义动物接口:死、活着
定义动物实现类:鸟、鱼、野兽(跑、捕食)
继承野兽:实现老虎,实现人
业务场景:工作日所有动物都活着、周末人出来捕食,野兽逃跑,其它动物死光光
*/

type Animal interface {
	Live()
	Godie()
}

type BaseAnimal struct {
	Name string
}

func (ba *BaseAnimal)Live()  {
	fmt.Printf("%s正在活着
",ba.Name)
}

func (ba *BaseAnimal)Godie()  {
	fmt.Printf("%s狗带
",ba.Name)
}

type Bird struct {
	BaseAnimal
}

//鸟鱼兽继承BaseAnimal,少写大量通用的生死方法,同时还获得了Name属性
type Fish struct {
	BaseAnimal
}

type Beast struct {
	BaseAnimal
}

func (b *Beast)Run()  {
	fmt.Printf("野兽%s正在奔跑
",b.Name)
}

func  (b *Beast)Hunt()  {
	fmt.Printf("野兽%s正在捕食
",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:
",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:
伯德狗带
尼莫狗带
野兽泰格正在奔跑
野兽大官人正在捕食

  

原文地址:https://www.cnblogs.com/yunweiqiang/p/11925686.html