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. Windows系统之间文件互传

    1)利用Windows自带的文件共享服务 本次试验以Win7为服务器端,win10为客户端 1.确保Win7服务端开启对应的服务及开放相应的端口号 进入命令行界面,输入netstat -an,查看44 ...

  2. PE文件加节感染之Win32.Loader.bx.V病毒分析

    一.病毒名称:Win32.Loader.bx.V 二.分析工具:IDA 5.5.OllyDebug.StudPE 三.PE文件加节感染病毒简介 PE病毒感染的方式比较多,也比较复杂也比较难分析,下面就 ...

  3. VRRP中的上层回的路由

    如图,PC1和PC2处于不同网段,他们到AR3都有两条路可以选,现在要让他们到达AR3负载均衡,并且当AR1和 AR2的其中一个路由器挂了之后,他们仍然可以正常到达AR3. 他们去往AR3的VRRP的 ...

  4. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

  5. Day001 基本的Dos命令

    基本的Dos命令 打开cmd的方式 开始+系统+命令提示符(有时候需要右键以管理员身份运行) Win+R键,输入cmd打开控制台 按住shift键的同时鼠标右键,点击在此处打开powershell窗口 ...

  6. layui处理表单/按钮进行多次提交

    在一个项目中,我们最频繁的操作是CRUD,所以一定有涉及到按钮的操作.比如:确认保存,确认编辑,确认删除等等.所以,为了避免表单进行多次提交就显得特别地重要. 代码实现 知识点 $(':button' ...

  7. 【vue-06】webpack npm

    什么是Webpack Webpack是一款模块加载器兼打包工具,他能把各种资源,比如js,css,less转化成一个静态文件,减少页面的请求,提高效率. 安装Webpack 在安装webpack之前, ...

  8. 03.21 ICPC训练联盟周赛:UCF Local Programming Contest 2018正式赛

    B Breaking Branches 题意:两个人比赛折枝,谁剩下最后1,无法折出整数即为输 思路:树枝长n,若是奇数,则Bob胜出,若是偶数,则Alice胜出,且需要输出1: 1 #include ...

  9. 不融资、不上市、不快马圈地…“佛系”ZOHO的中国生意经

    来源:钛媒体 作者:秦聪慧 "技术比肩SAP.直追微软的这家25岁"非典型"国际大厂会继续佛系下去吗? ZOHO研发中心大楼 在中国,有家相对低调的"舶来&qu ...

  10. 15.Git

    1.Git介绍 1.1版本控制(理解) 无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况 1.2开发中存在的问题(理解) 程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间 ...