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
铁蹄滚滚,尸横遍野 弓箭手防守
法师防守
GO语言面向对象05---接口的多态的更多相关文章
- Java 面向对象之接口、多态
01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...
- Java面向对象(接口、多态)
面向对象 今日内容介绍 u 接口 u 多态 第1章 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的 ...
- python面向对象 : 抽象类(接口类),多态,封装(私有制封装)
一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...
- 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装
抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...
- oop面向对象【接口、多态】
今日内容 1.接口 2.三大特征——多态 3.引用类型转换 教学目标 1.写出定义接口的格式 2.写出实现接口的格式 3.说出接口中成员的特点 4.能够说出使用多态的前提条件 5.理解多态的向上转型 ...
- PHP面向对象05_接口与多态
抽象类与接口 2014-9-2 9:14:32 摘要: 1.抽象类(abstract) 2.接口(interface) 3.多态的应用 1.抽象类(abstract) 特点: 1)抽象类使用abstr ...
- Java面向对象(二) 接口、多态和泛型
一.接口 二.多态 多态是同一个行为具有多个不同表现形式或形态的能力. 2.1 类型转换 转换方式 隐式 向上转型 对于基本数据类型,存储容量低的可自动向存储容量高的类型转换 对于引用变量,子类可被转 ...
- 11_Java面向对象_第11天(接口、多态)_讲义
今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...
- Go语言基础之接口(面向对象编程下)
1 接口 1.1 接口介绍 接口(interface)是Go语言中核心部分,Go语言提供面向接口编程,那么接口是什么? 现实生活中,有许多接口的例子,比如说电子设备上的充电接口,这个充电接口能干什么, ...
随机推荐
- 05.ElementUI源码学习:项目发布配置(github pages&npm package)
0x00.前言 书接上文.项目第一个组件已经封装好,说明文档也已编写好.下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages功能实现.同时将组件发布之 npm 上,方便 ...
- mooc人大单元测试4
@font-face { font-family: Wingdings } @font-face { font-family: 宋体 } @font-face { font-family: " ...
- 逻辑引擎、工作流、CMDB小感
工作流是啥? 在界面上画画点点就能生成代码,这是很吸引人的事情,也是很多自动化工具追求的目标.工作流就是这么一个东西,通过定义流程和输入,就能实现你想要的东西,不需要编写代码. 工作流的实现 通过解析 ...
- hdu4415 不错的想法题
题意: 一个人他有一定的血,有一些怪物,他去杀怪物,有的怪物杀死他后还可以在不费自己血的情况下任意杀死一些怪物,问你他最多杀死多少怪物,在最多杀怪前提下最好用多少血,(大体题意是这样). 思路: 首先 ...
- hdu1358 最小循环节,最大循环次数 KMP
题意: 给你一个字符串,让你找到一些字符串,这个字符串是从第一个字母开始的,并且他可以分成1个一上循环子结构够成的,比如 abcabcabc 那么当前的这个串就是三个abc构成的,他的A ...
- PWD 好网站
http://angelboy.logdown.com/ https://wizardforcel.gitbooks.io/sploitfun-linux-x86-exp-tut/content/ h ...
- Windows核心编程 第四章 进程(中)
4.2 CreateProcess函数 可以用C r e a t e P r o c e s s函数创建一个进程: BOOL CreateProcessW( _In_opt_ LPCWSTR lpAp ...
- php基础-php中使用变量
- mysql 的查询操作语句---自动生成各种不同的序号
1.通过查询语句添加自动生成序号 SELECT m.id,(@a :=@a + 1) AS a FROM 表名 m, (SELECT @a := 0) t1 2.MySQL字符串前后补0 前补0(LP ...
- 一种巧妙的使用 CSS 制作波浪效果的思路
在之前,我介绍过几种使用纯 CSS 实现波浪效果的方式,关于它们有两篇相关的文章: 纯 CSS 实现波浪效果! 巧用 CSS 实现酷炫的充电动画 本文将会再介绍另外一种使用 CSS 实现的波浪效果,思 ...