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. 概A第一章测试

    ·  问题 1√ 得 10 分,满分 10 分       A与B不能同时发生,表明A与B互不相容.               ·  问题 2× 得 10 分,满分 10 分       A与B互逆 ...

  2. Rabbitmq 3.6.5以上版本修改端口号方法

    Rabbitmq 3.6.5以上版本修改端口号方法,网上查了下有一些方不管用,所以自己实践了引用官网说明 https://www.rabbitmq.com/configure.html#configu ...

  3. 2020北航OO第一单元总结

    前言 学习面向对象这门课程的后的第一单元作业,主线是多项式求导,三次作业层层推进,由单一的幂函数求导,到幂函数和三角函数的复合求导,最后再到两种函数的嵌套求导,由两个类到重构后的十几个类,我逐渐对面向 ...

  4. 【目录】python全栈工程师

    第一阶段:Python 语言核心编程1. Python核心   -- 2048 游戏核心算法2. 面向对象   -- 天龙八部游戏技能系统3. Python高级   -- 集成操作框架项目:2048游 ...

  5. 『政善治』Postman工具 — 3、补充:restful风格接口的项目说明

    目录 (一)RESTful架构风格特点 1.统一接口风格 2.规范的HTTP请求方法 3.HTTP响应码 4.什么是无状态 (二)JSON数据格式说明 1.什么是JSON 2.JSON格式的特点 3. ...

  6. UVA11462年龄排序

    题意:       给你200w个人的年龄,年龄的范围是1-100,然后让你从小到大排序输出所有人的年龄,题目还特意强调输入文件限制25MB,题目内存限制2MB. 思路:      比较经典又简单的一 ...

  7. Day003 巧妙验证短路运算

    &&的短路运算 条件1&&条件2...&&条件n,程序会先判断条件1,如果条件1为false,则不判断后面的条件,直接返回false 怎么判断程序到底有 ...

  8. 一种Maven项目启动时不编译java文件的解决方案

    问题 前提介绍 : 环境版本 : JDK -version : 1.8.0-251 Tomcat -version : 8.5.5 Maven -version : 3.6.3 项目情况描述 使用ID ...

  9. pr加字幕

    选择免费字体 自由字体整理了免费的商用字体 安装字体 将下载好的.ttf文件,右键选择为所有用户安装 如果没有选择为所有用户安装,你在Arctime或者premiere中可能无法找到这个字体 而且想要 ...

  10. head元素的内容

    一.head元素 head元素的内容用来向浏览器提供一些文档信息,此外还可以包含js脚本和css层叠样式单.head中一般包含title.meta.css.js等内容,head中元素的内容在浏览器中不 ...