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

  

GO语言面向对象05---接口的多态的更多相关文章

  1. Java 面向对象之接口、多态

    01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...

  2. Java面向对象(接口、多态)

    面向对象 今日内容介绍 u 接口 u 多态 第1章 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的 ...

  3. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

  4. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  5. oop面向对象【接口、多态】

    今日内容 1.接口 2.三大特征——多态 3.引用类型转换 教学目标 1.写出定义接口的格式 2.写出实现接口的格式 3.说出接口中成员的特点 4.能够说出使用多态的前提条件 5.理解多态的向上转型 ...

  6. PHP面向对象05_接口与多态

    抽象类与接口 2014-9-2 9:14:32 摘要: 1.抽象类(abstract) 2.接口(interface) 3.多态的应用 1.抽象类(abstract) 特点: 1)抽象类使用abstr ...

  7. Java面向对象(二) 接口、多态和泛型

    一.接口 二.多态 多态是同一个行为具有多个不同表现形式或形态的能力. 2.1 类型转换 转换方式 隐式 向上转型 对于基本数据类型,存储容量低的可自动向存储容量高的类型转换 对于引用变量,子类可被转 ...

  8. 11_Java面向对象_第11天(接口、多态)_讲义

    今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...

  9. Go语言基础之接口(面向对象编程下)

    1 接口 1.1 接口介绍 接口(interface)是Go语言中核心部分,Go语言提供面向接口编程,那么接口是什么? 现实生活中,有许多接口的例子,比如说电子设备上的充电接口,这个充电接口能干什么, ...

随机推荐

  1. Java 常用类总结(SE基础)

    本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...

  2. JDK8新特性(二) 流式编程Stream

    流式编程是1.8中的新特性,基于常用的四种函数式接口以及Lambda表达式对集合类数据进行类似流水线一般的操作 流式编程分为大概三个步骤:获取流 → 操作流 → 返回操作结果 流的获取方式 这里先了解 ...

  3. 基于DRV8701的电机驱动设计

    栅极驱动芯片DRV8701使用的一些注意事项

  4. sublime常用快键键

    ---------------最常用的1.新建文件-输入"html:xt"后  按"Ctrl+E键"或 "tab键" ,可快速生成xhtml ...

  5. 提示No input file specified的解决方法

    (一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi. ...

  6. hdu4791水题

    题意:       打印东西,给你区间和每个区间的价格,然后输入任务张数,输出最少花费..    题解:       昨晚的小测试就有这个题目,当时蒙B了,怎么也读不懂题目,一直纠结怎么把150拆成1 ...

  7. Linux启动流程和服务管理(init和systemd)

    目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...

  8. Linux中Tomcat和Jboss的安装和部署

    目录 JDK环境 yum源安装JDK 源码包安装JDK Tomcat的安装 yum源安装 目录结构: 源码包安装 目录结构: 目录中主要的文件: JBoss的安装 目录结构: Tomcat是Apach ...

  9. Python第四章-字典

    第四章 字典-当索引不好用时 4.0     字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping).   字典是Python中唯一内建的映射类型,字典中的值并 ...

  10. Win64 驱动内核编程-2.基本框架(安装.通讯.HelloWorld)

    驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. ...