package main

import "fmt"

/*
定义动物接口:死、活着
定义动物实现类:鸟、鱼、野兽(跑、捕食)
继承野兽:实现老虎,实现人
业务场景:工作日所有动物都活着、周末人出来捕食,野兽逃跑,其它动物死光光
*/ type Animal interface {
Live()
Godie()
} type BaseAnimal struct {
Name string
} func (ba *BaseAnimal)Live() {
fmt.Printf("%s正在活着\n",ba.Name)
} func (ba *BaseAnimal)Godie() {
fmt.Printf("%s狗带\n",ba.Name)
} type Bird struct {
BaseAnimal
} //鸟鱼兽继承BaseAnimal,少写大量通用的生死方法,同时还获得了Name属性
type Fish struct {
BaseAnimal
} type Beast struct {
BaseAnimal
} func (b *Beast)Run() {
fmt.Printf("野兽%s正在奔跑\n",b.Name)
} func (b *Beast)Hunt() {
fmt.Printf("野兽%s正在捕食\n",b.Name)
} type Tiger struct {
Beast
} type Human struct {
Beast
} func main() {
animals := make([]Animal, 0)
animals = append(animals, &Bird{BaseAnimal{"伯德"}})
animals = append(animals, &Fish{BaseAnimal{"尼莫"}})
animals = append(animals, &Tiger{Beast{BaseAnimal{"泰格"}}})
animals = append(animals, &Human{Beast{BaseAnimal{"大官人"}}}) for i:=1;i<=7 ;i++ {
fmt.Printf("今天星期%d:\n",i)
if i<=5{
for _,a:=range animals{
a.Live()
}
}else{
for _,a := range animals{
if human,ok := a.(*Human);ok{
human.Hunt()
}else if tiger,ok := a.(*Tiger);ok {
//断言为Beast是定位不到Tiger的,因为丢入容器时丢的是老虎对象,因此只能断言为老虎
tiger.Run()
}else{
a.Godie()
} }
}
fmt.Println()
}
}

输出:

今天星期1:
伯德正在活着
尼莫正在活着
泰格正在活着
大官人正在活着 今天星期2:
伯德正在活着
尼莫正在活着
泰格正在活着
大官人正在活着 今天星期3:
伯德正在活着
尼莫正在活着
泰格正在活着
大官人正在活着 今天星期4:
伯德正在活着
尼莫正在活着
泰格正在活着
大官人正在活着 今天星期5:
伯德正在活着
尼莫正在活着
泰格正在活着
大官人正在活着 今天星期6:
伯德狗带
尼莫狗带
野兽泰格正在奔跑
野兽大官人正在捕食 今天星期7:
伯德狗带
尼莫狗带
野兽泰格正在奔跑
野兽大官人正在捕食

  

GO语言面向对象06---面向对象练习01的更多相关文章

  1. JavaSE学习总结第06天_Java语言基础2 & 面向对象1

      06.01 二维数组概述和格式1的讲解 二维数组概述:二维数组其实就是一个元素为一维数组的数组 格式1:数据类型[][] 变量名 = new 数据类型[m][n]; m表示这个二维数组有多少个一维 ...

  2. 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字

    081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...

  3. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  4. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  5. C++对C语言的非面向对象特性扩充(3)

    今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(refer ...

  6. Golang 入门系列(五)GO语言中的面向对象

    前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友可以先看看之前的文章.https://www.cnblogs.com/zhangweizhong/category/ ...

  7. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  8. 2018.3.5 Java语言基础与面向对象编程实践

    Java语言基础与面向对象编程实践 第一章 初识Java 1.Java特点 http://www.manew.com/blog-166576-20164.html Java语言面向对象的 Java语言 ...

  9. 怎样在C语言里实现“面向对象编程”

    有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样.面向对象作为一种设计方法.是不限制语言的.仅仅能说,用C++/Java这样的语法来实现面向对象会更easy.更自然一些. 在本节中 ...

  10. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

随机推荐

  1. Amazon EFS CSI 驱动程序 为eks 提供存储服务

    官方文档:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.html

  2. zipfile tarfile模块

    zipfile --- 使用ZIP存档 这个模块提供了创建.读取.写入.添加及列出 ZIP 文件的工具 # 创建一个ZipFile对象, 可使用上下文管理 with class zipfile.Zip ...

  3. Java | 使用OpenFeign管理多个第三方服务调用

    背景 最近开发了一个统一调度类的项目,需要依赖多个第三方服务,这些服务都提供了HTTP接口供我调用. 服务多.接口多,如何进行第三方服务管理和调用就成了问题. 常用的服务间调用往往采用zk.Eurek ...

  4. OAuth 2.0、OIDC 原理

    OAuth 目录 OAuth 什么是 OAuth? 为什么是 OAuth? SAML OAuth 和 API OAuth 主要组件 OAuth 作用域 OAuth 参与者 OAuth 令牌 OAuth ...

  5. Laravel结构生成器

    简介 Laravel 的 Schema 类提供了一种与数据库无关的方式维护表.它和 Laravel 所支持的所有数据库都能很好的工作,并且提供了统一的接口. 创建和删除表 使用 Schema::cre ...

  6. 1669 DINIC+二分

    题意:       给你一些名单,和每个名单可以放在哪个分组里,现在要求你把所有的人都分到一个他属于的分组(之一),然后问你分组中最多的那个人数最少是多少... 思路:      二分最多的最少,然后 ...

  7. hdu4849 最短路

    题意:       让你求0到所有点最短路中对m取余最小的那个数. 思路:       简单题,直接根据题目给的公式把z求出来,然后建边,然后最短路,然后枚举每一个点对m取余记录最小,然后输出答案,然 ...

  8. mongoDB常用

    登陆{ 本地的话直接mongo,如果是docker直接就这样docker exec -it 2d71a13e3128 mongo 或者直接这样 mongo 127.0.0.1:27017 } 退出是 ...

  9. WPF中属性经动画处理后无法更改的问题

    在WPF的Animation中,有一个属性为FillBehavior,用于指定时间线在其活动周期结束后但其父时间线仍处于活动周期或填充周期时的行为方式.如果希望动画在活动周期结束时保留其值,则将动画F ...

  10. Java 并发编程(一) → LockSupport 详解

    开心一刻 今天突然收到花呗推送的消息,说下个月 9 号需要还款多少钱 我就纳了闷了,我很长时间没用花呗了,怎么会欠花呗钱? 后面我一想,儿子这几天玩了我手机,是不是他偷摸用了我的花呗 于是我找到儿子问 ...