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. Python脚本破解Linux口令(crypt模块)

    环境 Kali Linux ,python版本2.7.13 . 我们利用Linux系统中的 crypt 模块模拟了Linux系统中用户密码的加密,在Windows中是不存在这个库的. 在Linux系统 ...

  2. Msfvenonm生成一个后门木马

    在前一篇文章中我讲了什么是Meterpreter,并且讲解了Meterpreter的用法.传送门-->Metasploit之Meterpreter 今天我要讲的是我们用Msfvenom制作一个木 ...

  3. nodejs-REPL/回调函数/事件循环

    REPL 回调函数 事件循环 REPL----------------------------------------------------- Node.js REPL(Read Eval Prin ...

  4. Day008 三种初始化及内存分析

    三种初始化和内存分析 Java内存分析: 堆: 存放new的对象和数组. 可以被所有的线程共享,不会存放别的对象引用. 栈: 存放基本变量类型(会包含这个基本类型的具体数值). 引用对象的变量(会存放 ...

  5. 如何在centos上配置802.1Q VLAN标记,linux单网卡多vlan多网段Ip配置案例

    介绍 VLAN使将大型网络分成较小且易于管理的网络成为可能.802.1Q是所有供应商都在其网络设备中实施的标准.某些交换机能够将多个VLAN分配给单个网络端口.使用此功能,您可以将多个VLAN分配给单 ...

  6. 多线程-3.sleep() yield() join()

    1.sleep()方法 jdk文档描述:Causes the currently executing thread to sleep (temporarily cease execution) for ...

  7. IO异步,读写压缩文件,监控文件系统

    这节结尾IO,讲一下异步操作文件,读写压缩文件,监控文件系统这三个知识点. 异步操作文件:     说到异步,必然要了解的是async和await这两个关键字(异步详情点击基于任务的异步编程(Task ...

  8. 逆向工程初步160个crackme-------3

    这个Crackme3 涉及到浮点指令以及浮点数的存储与运算,我没学习过浮点指令,不得不从网上恶补了1个小时,一边看汇编指令一边百度其指令含义. 回头得好好补补这方面的知识了,太菜了! 我大致了解了一下 ...

  9. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的Continuous read模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的Continuous read模式. 前面关于串行Flash传输时序的文章 <Fast R ...

  10. [Python] 基本概念

    1.基本概念 三大特性:封装.继承.多态 继承:派生类继承基类的字段和方法 多态:对不同类型的变量进行相同的操作,却表现出不同的行为(例如对数字和字符做"+"运算) 封装:将数据和 ...