咔咔博客之多态
- 多态是指,一个父类接口可以拥有多种子类实现形态
- 这些子类形态之间有相同点,那就是它们都实现了父类接口中的方法
- 不同点则是大家对父类接口方法的实现方式各不相同,演绎何为千姿百态
代码地址
https://github.com/fangkang7/goLearn
案例
定义父类接口Worker
// 定义工人接口 type Worker interface { // 每天工作多少小时,产出何种产品 Work(hour int) (chanpin string) // 休息 Rest() }
// 定义码农 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("休息是什么???") }
// 定义产品经理 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 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切片,并且调用各子类的方法
注意点
- 在创建切片时的名字需要跟接口名一致
- 扩容切片时需要添加指针 而非值
- 创建随机数需要种子选手