码迷,mamicode.com
首页 > 编程语言 > 详细

GO语言面向对象06---面向对象联系

时间:2019-11-25 09:30:56      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:实现   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:
伯德狗带
尼莫狗带
野兽泰格正在奔跑
野兽大官人正在捕食

  

GO语言面向对象06---面向对象联系

标签:实现   name   else   UNC   fish   import   als   package   属性   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!