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 铁蹄滚滚,尸横遍野 弓箭手防守 法师防守