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. 淘宝欺骗病毒的鉴定--TaBAccelerate.dll

    样本名称:TaBAccelerate.dll 样本大小:1135104 字节 样本MD5:7AEF6EEECB37685D17F3D9BD76FA9EA0 样本SHA1: EB1E5ABA7C3797 ...

  2. UVA10294项链和手镯(等价类计数问题)

    题意:       给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯 ...

  3. coding push 上传文件

    git config --global user.name "lyshark" &git config --global user.email "11815068 ...

  4. node-多进程

    Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能. 每个子进程总是带有三个流对象: child.stdin, ...

  5. Android持续优化 - 提高流畅度

    http://www.cnblogs.com/purediy/archive/2013/12/26/3492865.html

  6. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

  7. javaScript的成长之路【何为函数,面向对象又是啥!!!】

  8. myysql 不能远程访问的解决办法

    1.通过navicat或者命令行,将user表中原来host=localhost的改为host=% 命令行方式: mysql> update user set host = '%' where ...

  9. 【一】kubernetes学习笔记-Pod概念

    一.Pod 控制器类型 Pod概念 当一个 Pod 创建后,Pause 容器就会随着 Pod 启动,只要是有 Pod,Pause 容器就要被启动. 在同一个 Pod 里面的容器不能出现端口冲突,否则这 ...

  10. MySQL redo与undo日志解析

    前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更 ...