【Go】面向对象(五):多态

2021-09-16 11:25:02 浏览数 (1)

  • 接口:只有方法的定义,没有实现——全部是抽象方法
  • 实现接口:结构体实现接口的全部抽象方法,称为结构体实现了接口
  • 多态:一个父类/接口有不同的子类实现,本例中【劳动者接口】的具体实现有【程序员】、【产品经理】、【老板】
  • 共性:【程序员】、【产品经理】、【老板】都会劳动和休息
  • 个性:【程序员】、【产品经理】、【老板】的劳动方式和休息方式 各不相同
代码语言:javascript复制
package main

import (
	"fmt"
)

/*
接口:只有方法的定义,没有实现——全部是抽象方法

实现接口:结构体实现接口的全部抽象方法,称为结构体实现了接口

多态:一个父类/接口有不同的子类实现,本例中【劳动者接口】的具体实现有
【程序员】、【产品经理】、【老板】

共性:【程序员】、【产品经理】、【老板】都会劳动和休息

个性:【程序员】、【产品经理】、【老板】的劳动方式和休息方式
各不相同
*/
type Worker interface {
	Work(hour int) (product string)

	Rest()
}

type Coder struct {
	skill string
}

func (w *Coder)Work(hour int) (product string) {
	fmt.Printf("码农一天工作%d个小时n",hour)
	fmt.Printf("码农正在%sn",w.skill)
	return "Bug"
}

func (w *Coder) Rest()  {
	fmt.Printf("休息是什么?n")
}

func (w *Coder)WorkHome()  {
	fmt.Println("程序员在家工作")
}

type ProductManager struct {
	skill string
}

func (w *ProductManager)Work(hour int) (product string) {
	fmt.Printf("产品经理一天工作%d个小时n",hour)
	fmt.Printf("产品经理正在%sn",w.skill)
	return "happy"
}

func (w *ProductManager) Rest()  {
	fmt.Printf("休息看程序员工作?")
}

type Boss struct {
	skill string
}

func (w *Boss)Work(hour int) (product string) {
	fmt.Printf("老板一天工作%d个小时n",hour)
	fmt.Printf("老板正在%sn",w.skill)
	return "睡觉"
}

func (w *Boss) Rest()  {
	fmt.Printf("老板一天到晚都在休息")
}

func main() {
	workers := make([]Worker, 0)
	workers = append(workers, &Coder{"撸代码"})
	workers = append(workers, &ProductManager{"拍脑门"})
	workers = append(workers, &Boss{"吹牛逼"})

	//r := rand.New(rand.NewSource(time.Now().UnixNano()))
	//weekday := r.Intn(7)
	weekday := 6
	fmt.Printf("今天是星期%dn",weekday)

	if weekday>0 && weekday<6{
		for _,worker := range workers{
			worker.Work(8)
		}
	}else {
		for _,worker := range workers{
			if coder,ok := worker.(*Coder);ok{
				coder.WorkHome()
			}else {
				coder.Rest()
			}
		}
	}
}

0 人点赞