GO --- 05 object-oriented language interface polymorphism

package main

import "fmt"

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

/*cavalry*/
type Rider struct{}
func (r *Rider)Attack() (bloodloss int) {
	fmt.Println ( "iron heel rolling, littered with corpses \ n")
	return 100
}

func (r *Rider)Defend()  {
	fmt.Println ( "Cavalry defense")
}

/*Archer*/
type Archer struct {}
func (a *Archer)Attack() (bloodloss int) {
	fmt.Println ( "thousand arrows shot! \ n")
	return 50
}
func (a *Archer)Defend()  {
	fmt.Println ( "Archer defense")
}

/ * * Master /
type Master struct {}
func (a *Master)Attack() (bloodloss int) {
	fmt.Println ( "Abracadabra cloud flying million soldiers! \ n")
	return 50
}
func (a *Master)Defend()  {
	fmt.Println ( "Mage defense")
}

func main() {
	// Create an army
	fighters := make([]Fighter, 0)

	// add a variety of forms to achieve the soldiers
	fighters = append(fighters, &Rider{})
	fighters = append(fighters, &Archer{})
	fighters = append(fighters, &Master{})
	/*
	Allowing users to make hair
	The first representative of cavalry, archers second representative, on behalf of the third Master, 9 = offense, defense = 0, for example:
	999 = all offensive
	000 = the entire defense
	090 = archer attack, other branches of the military defense
	*/
	was cmd string
	for {
		fmt.Println ( "General, please Herald:")
		fmt.Scan(&cmd)
		switch cmd {
		case "exit":
			goto GAMEOVER
		case "all offensive":
			// all offensive
			for _,fighter := range fighters{
				fighter.Attack()
			}
		case "all defense":
			// all defense
			for _,fighter := range fighters{
				fighter.Defend()
			}
		default:
			/ * Different branches of the military to perform different commands * /

			// assert one:
			/*for _,f := range fighters{
				// dispatch cavalry
				if _,ok := f.(*Rider);ok{
					if cmd[0] == '9'{
						f.Attack()
					}else {
						f.Defend()
					}
				}
				// scheduling archer
				if _,ok := f.(*Archer);ok{
					if cmd[1] == '9'{
						f.Attack()
					}else {
						f.Defend()
					}
				}
				// Master Scheduling
				if _,ok := f.(*Master);ok{
					if cmd[2] == '9'{
						f.Attack()
					}else {
						f.Defend()
					}
				}
			}*/

			// assert Method Two:
			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!")

}

Output:

General, please messenger:
000
Cavalry defense
Archer defense
Mage defense
General, please messenger:
999
Iron heel rolling, littered with corpses

Thousand arrows shot!

Abracadabra cloud flying million soldiers!

General, please messenger:
090
Cavalry defense
Thousand arrows shot!

Mage defense
General, please messenger:
All offensive
Iron heel rolling, littered with corpses

Thousand arrows shot!

Abracadabra cloud flying million soldiers!

General, please messenger:
All defensive
Cavalry defense
Archer defense
Mage defense
General, please messenger:
909
Iron heel rolling, littered with corpses

Archer defense
Abracadabra cloud flying million soldiers!

General, please messenger:
900
Iron heel rolling, littered with corpses

Archer defense
Mage defense

  

Guess you like

Origin www.cnblogs.com/yunweiqiang/p/11925141.html