咔咔博客之多态
- 多态是指,一个父类接口可以拥有多种子类实现形态
- 这些子类形态之间有相同点,那就是它们都实现了父类接口中的方法
- 不同点则是大家对父类接口方法的实现方式各不相同,演绎何为千姿百态
代码地址
https://github.com/fangkang7/goLearn
案例
定义父类接口Worker
// 定义工人接口
type Worker interface {
// 每天工作多少小时,产出何种产品
Work(hour int) (chanpin string)
// 休息
Rest()
}
子类Coder实现一
// 定义码农
type Coder struct {
skill string
}
func (Coder *Coder) Work(hour int) (chanpin string) {
fmt.Printf("码农一天工作%d小时\n", hour)
return "BUG"
}
func (Coder *Coder) Rest() {
fmt.Println("休息是什么???")
}
子类ProduceManager实现二
// 定义产品经理
type ProductManager struct {
skill string
}
func (P *ProductManager) Work(hour int) (chanpin string) {
fmt.Printf("产品一天工作%d小时\n", hour)
return "无逻辑的需求"
}
func (P *ProductManager) Rest() {
fmt.Println("产品可以使劲的休息")
}
子类Boos实现三
// 定义boos
type Boos struct {
skill string
}
func (Boos *Boos) Work(hour int) (chanpin string) {
fmt.Printf("boos一天工作%d小时\n", hour)
return "梦想"
}
func (Boos *Boos) Rest() {
fmt.Println("无休息")
}
共性
func main() {
// 创建一个工人切片保存三种职业
// 这里需要注意一个点 这个切片的名字Worker需要跟接口名一致
workers := make([]Worker, 0)
// 往切片添加的都是指针并非值,因为在方法主语用的是指针形式 (Boos *Boos)
workers = append(workers, &Coder{skill: "写代码"})
workers = append(workers, &ProductManager{skill: "提需求"})
workers = append(workers, &Boos{skill: "想方案"})
// 创建一个种子
r := rand.New(rand.NewSource(time.Now().UnixNano()))
// 创建一个随机数代表星期几
weekday := r.Intn(7)
if weekday > 0 && weekday < 6 {
for _, Worker := range workers {
Worker.Work(8)
}
} else {
for _, Worker := range workers {
Worker.Rest()
}
}
}
案例详解
- 在这个案例中,我们定义了一个Worker的接口,并且定义了俩个抽象方法
- 然后定义了三个子类来实现Worker接口
- 实现接口 就是把接口的方法都实现即可
- 然后在main函数里边创建一个Worker的切片 这里需要注意的是在使用make创建切片时需要一个默认size
- 在扩容切片时需要传入指针。因为在方法主语是使用的指针 并非值
- 然后使用for循环来遍历Worker切片,并且调用各子类的方法
注意点
- 在创建切片时的名字需要跟接口名一致
- 扩容切片时需要添加指针 而非值
- 创建随机数需要种子选手