package main
//多态:一个父类或接口有多种不同的子类实现。
//接口:只有方法的定义,没有具体的实现,全部是抽象方法。
//实现接口:结构体实现接口的全部抽象方法,就称为结构体实现了接口。
import "fmt"
//劳动者父类接口
//内含两个方法工作和休息
type Worker interface {
//每天工作多少小时,产出什么产品 对工作定义了方法 参数时间,返回值产品
Work(hour int) (product string)
//休息方法
Rest()
}
type Coder struct {
skill string
}
func (c *Coder) Work(hour int) (product string) {
fmt.Printf("码农一天工作%d小时", hour)
fmt.Printf("码农的技能是%s", c.skill)
return "BUG"
}
func (c *Coder) Rest() {
fmt.Printf("休息是什么")
}
func (c *Coder) HomeWork() {
fmt.Println("在家工作")
}
type ProductManager struct {
skill string
}
func (pm *ProductManager) Work(hour int) (product string) {
fmt.Printf("码农一天工作%d小时", hour)
fmt.Printf("码农的技能是%s", pm.skill)
return "无逻辑的需求"
}
func (pm *ProductManager) Rest() {
fmt.Println("看程序员写代码")
}
type Boss struct {
skill string
}
func (b *Boss) Work(hour int) (product string) {
fmt.Printf("老板一天工作了%d小时", hour)
fmt.Printf("老板的技能是%s", b.skill)
return "梦想"
}
func (b *Boss) Rest() {
fmt.Printf("从早到晚休息")
}
func main() {
//创建有worker组成的切片
workers := make([]Worker, 0)
workers = append(workers, &Coder{"写代码"})
workers = append(workers, &ProductManager{"拍脑门"})
workers = append(workers, &Boss{"吹牛逼"})
//类型断言,判断接口的类型
//有两种方式 一种方式更范围更广
for _, worker := range workers {
switch worker.(type) {
case *Coder:
fmt.Println("人家是写代码的")
case *ProductManager:
fmt.Println("人家是搞创意的")
case *Boss:
fmt.Println("我是给员工打工的")
default:
fmt.Println("不清楚是什么东西")
}
}
//粒度更细点
for _, workers := range workers {
if coder, ok := workers.(*Coder); ok {
fmt.Println("我是写代码的")
coder.HomeWork()
}
}
}