GO语言面向对象05---接口的多态

package main

import "fmt"

type Fighter interface {
	Attack() (bloodloss int)
	Defend()
}

/*骑兵*/
type Rider struct{}
func (r *Rider)Attack() (bloodloss int) {
	fmt.Println("铁蹄滚滚,尸横遍野\n")
	return 100
}

func (r *Rider)Defend()  {
	fmt.Println("骑兵防守")
}

/*弓箭手*/
type Archer struct {}
func (a *Archer)Attack() (bloodloss int) {
	fmt.Println("万箭齐发!\n")
	return 50
}
func (a *Archer)Defend()  {
	fmt.Println("弓箭手防守")
}

/*法师*/
type Master struct {}
func (a *Master)Attack() (bloodloss int) {
	fmt.Println("天灵灵地灵灵云中飞来百万兵!\n")
	return 50
}
func (a *Master)Defend()  {
	fmt.Println("法师防守")
}

func main() {
	//创建一支军队
	fighters := make([]Fighter, 0)

	//添加战士的多种实现形态
	fighters = append(fighters, &Rider{})
	fighters = append(fighters, &Archer{})
	fighters = append(fighters, &Master{})
	/*
	让用户发将令
	第一位代表骑兵,第二位代表弓箭手,第三位代表法师,9=进攻,0=防守,例如:
	999=全体进攻
	000=全体防守
	090=弓箭手进攻,其他兵种防守
	*/
	var cmd string
	for {
		fmt.Println("大将军,请传令:")
		fmt.Scan(&cmd)
		switch cmd {
		case "exit":
			goto GAMEOVER
		case "全体进攻":
			//全体进攻
			for _,fighter := range fighters{
				fighter.Attack()
			}
		case "全体防守":
			//全体防守
			for _,fighter := range fighters{
				fighter.Defend()
			}
		default:
			/*不同兵种执行不同命令*/

			//断言方法一:
			/*for _,f := range fighters{
				//调度骑兵
				if _,ok := f.(*Rider);ok{
					if cmd[0] == '9'{
						f.Attack()
					}else {
						f.Defend()
					}
				}
				//调度弓箭手
				if _,ok := f.(*Archer);ok{
					if cmd[1] == '9'{
						f.Attack()
					}else {
						f.Defend()
					}
				}
				//调度法师
				if _,ok := f.(*Master);ok{
					if cmd[2] == '9'{
						f.Attack()
					}else {
						f.Defend()
					}
				}
			}*/

			//断言方法二:
			for _,fighter := range fighters{
				switch fighter.(type) {
				case *Rider:
					if cmd[0] == '9'{
						fighter.Attack()
					}else {
						fighter.Defend()
					}
				case *Archer:
					if cmd[1] == '9'{
						fighter.Attack()
					}else {
						fighter.Defend()
					}
				case *Master:
					if cmd[2] == '9'{
						fighter.Attack()
					}else {
						fighter.Defend()
					}
				}
			}
		}
	}

	GAMEOVER:
		fmt.Println("GAMEOVER!")

}

输出:

大将军,请传令:
000
骑兵防守
弓箭手防守
法师防守
大将军,请传令:
999
铁蹄滚滚,尸横遍野

万箭齐发!

天灵灵地灵灵云中飞来百万兵!

大将军,请传令:
090
骑兵防守
万箭齐发!

法师防守
大将军,请传令:
全体进攻
铁蹄滚滚,尸横遍野

万箭齐发!

天灵灵地灵灵云中飞来百万兵!

大将军,请传令:
全体防守
骑兵防守
弓箭手防守
法师防守
大将军,请传令:
909
铁蹄滚滚,尸横遍野

弓箭手防守
天灵灵地灵灵云中飞来百万兵!

大将军,请传令:
900
铁蹄滚滚,尸横遍野

弓箭手防守
法师防守

  

猜你喜欢

转载自www.cnblogs.com/yunweiqiang/p/11925141.html