package main

import "fmt"

/*
·定义接口IPerson,定义吃喝睡三个抽象方法;
·定义一个IPerson的实现类Person,实现吃喝睡方法;
·定义IWorker劳动者接口,拥有劳动方法Work()(output string)其中output是其工作产出,和休息方法Rest();
·IWorker实现三个不同职业的子类:程序员Coder、老师Teacher、农民Farmer,并创建一个Worker的集合;
·程序员、老师、农民都有姓名属性,也都有技能属性;
·实现周一到周五全体工作,如果是周六日程序员工作,老师休息,农民吃喝睡;
*/ type IPerson interface {
Eat()
Drink()
Sleep()
} type IWorker interface {
//IPerson
Work()(output string)
Rest()
} type Person struct {
Name string
Age int
} func (p *Person)Eat(){
fmt.Printf("%s正在吃饭\n",p.Name)
}
func (p *Person)Drink(){
fmt.Printf("%s正在痛饮\n",p.Name)
}
func (p *Person)Sleep(){
fmt.Printf("%s正在睡觉\n",p.Name)
} type Worker struct {
Person
Skill string
OutPut string
Hours int
Zhicheng string
} func (w *Worker)Work()(output string){
fmt.Printf("%s正在%s,并将产出%s\n",w.Name,w.Skill,w.OutPut)
return w.OutPut
}
func (w *Worker)Rest(){
fmt.Printf("%s正在休息\n",w.Name)
} type Coder struct {
Person
Worker
} type Teacher struct {
Person
Worker
} type Farmer struct {
Person
Worker
} func main() {
workers := make([]IWorker, 0)
workers = append(workers, &Coder{Person:Person{Name:"比尔"},Worker:Worker{Person:Person{Name:"比尔"},Skill:"撸码艺术",OutPut:"BUG"}})
workers = append(workers, &Teacher{Person:Person{Name:"杰克马"},Worker:Worker{Person:Person{Name:"杰克马"},Skill:"教书",OutPut:"人才"}})
workers = append(workers, &Farmer{Person:Person{Name:"隆平哥"},Worker:Worker{Person:Person{Name:"隆平哥"},Skill:"种地",OutPut:"粮食"}}) for i:=1;i<=7 ;i++ {
fmt.Printf("今天星期%d\n",i)
if i<=5{
for _,w := range workers{
w.Work()
}
}else {
/*for _,w := range workers{
switch w.(type) {
case *Coder:
w.Work()
case *Teacher:
w.Rest()
case *Farmer:
farmer := w.(*Farmer)
farmer.Eat()
farmer.Drink()
farmer.Sleep()
}
}*/
for _,w := range workers{
if coder,ok:=w.(*Coder);ok{
coder.Work()
}else if teacher,ok:=w.(*Teacher);ok{
teacher.Rest()
}else if farm,ok:=w.(*Farmer);ok{
farm.Eat()
farm.Drink()
farm.Sleep()
}
}
}
fmt.Println()
}
}

  输出:

今天星期1
比尔正在撸码艺术,并将产出BUG
杰克马正在教书,并将产出人才
隆平哥正在种地,并将产出粮食 今天星期2
比尔正在撸码艺术,并将产出BUG
杰克马正在教书,并将产出人才
隆平哥正在种地,并将产出粮食 今天星期3
比尔正在撸码艺术,并将产出BUG
杰克马正在教书,并将产出人才
隆平哥正在种地,并将产出粮食 今天星期4
比尔正在撸码艺术,并将产出BUG
杰克马正在教书,并将产出人才
隆平哥正在种地,并将产出粮食 今天星期5
比尔正在撸码艺术,并将产出BUG
杰克马正在教书,并将产出人才
隆平哥正在种地,并将产出粮食 今天星期6
比尔正在撸码艺术,并将产出BUG
杰克马正在休息
隆平哥正在吃饭
隆平哥正在痛饮
隆平哥正在睡觉 今天星期7
比尔正在撸码艺术,并将产出BUG
杰克马正在休息
隆平哥正在吃饭
隆平哥正在痛饮
隆平哥正在睡觉

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. python面向对象07/异常处理

    python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...

  9. Python之面向对象:面向对象基础

    一.面向过程.面向对象对比 1.面向过程 根据业务逻辑从上到下写垒代码 2.函数式思想 将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 3.面向对象 对函数进行分类和封装 1.2.3一步 ...

  10. PHP之面向对象PHP之面向对象(面向对象是什么)

    PHP之面向对象(面向对象是什么) 一.总结 一句话总结: 面向对象就是类:类都要 属性 和 方法 比如人:属性比如身高体重,方法比如吃饭喝水 面向对象中 ,方法即是函数 : 属性即是变量 ,只是面相 ...

随机推荐

  1. 在nginx配置将请求转发到某个真实后端服务ip

    一.打开nginx机器的nginx配置文件 命令: locate nginx.conf 会列出所有nginx.conf文件的地址, 一般咱们要用的nginx配置文件是/usr/local/nginx/ ...

  2. 聊一聊Jmeter的参数化

    背景 前面一篇讲了 JMeter 的一个最简单的例子,这篇聊一下 JMeter 的参数化. 在开始之前先来一个单元测试的例子,感受一下参数化. 上面是一个用 xUnit 写的单元测试,这个单元测试就是 ...

  3. OO第一单元总结——求导

    一.基于度量分析程序结构 (一)第一次作业 (1)设计思路 本次作业只涉及到简单幂函数通过加减运算而复合而成的函数,因此笔者自然的把函数分成了函数本体以及单个的项两个部分,在笔者的设计中两个类的功能如 ...

  4. kali 中文乱码解决

    在命令行输入"dpkg-reconfigure locales".进入图形化界面之后,(空格是选择,Tab是切换,*是选中),选中en_US.UTF-8和zh_CN.UTF-8,确 ...

  5. Linux文件共享服务之Vsftp

    目录 FTP Vsftp服务的搭建 ftp.sftp.vsftp.vsftpd的区别 FTP FTP的工作原理: FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道.控制通道是和FTP服务器进 ...

  6. hdu4932 小贪心

    题意:      给了一些处在x轴上的点,要求我们用长度相等的线段覆盖所有点,线段和线段之间不能重叠,问线段最长可以使多长. 思路:       一开始一直在想二分,哎!感觉这个题目很容易就往二分上去 ...

  7. Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3.1  汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov  eax,5  ;5送EAX寄存器 add   ...

  8. metasploit console 命令解释

    折腾几天,总算是在虚拟机中安装好了4.2版本的metasploit,能够成功打开console,这里将metasploit console的指令用中文翻一下: 原文及翻译: back Move bac ...

  9. 记一次 .NET 医院CIS系统 内存溢出分析

    一:背景 1. 讲故事 前几天有位朋友加wx求助说他的程序最近总是出现内存溢出,很崩溃,如下图: 和这位朋友聊下来,发现他也是搞医疗的,哈哈,.NET 在医疗方面还是很有市场的,不过对于内存方面出的问 ...

  10. 浅谈Java的诞生和现状

    昨天在旅途中登录一下很久没用的boss直聘,看看行情,一天的时间,已经有20+家公司给我发出了面试邀请,先跟大家谈谈Java的诞生和现状. 传说,在二十世纪90年代,一个叫Sun的公司,成立了一个项目 ...