GO-面向对象3-多态

多态概述

  • 多态是指,一个父类接口可以拥有多种子类实现形态
  • 这些子类形态之间有相同点,那就是它们都实现了父类接口中的方法
  • 不同点则是大家对父类接口方法的实现方式各不相同,演绎何为千姿百态
  • 例如,定义一个父类接口战士,凡战士者势必能攻能守,所以定义两个抽象方法:进攻与防守,但不做具体实现
  • 骑兵、步兵、法师都能杀敌护国,他们是战士接口的三个子类实现
  • 所以他们的共性是:都有进攻方法与防守方法
  • 而他们的不同点是:具体的进攻方式各不相同,具体的防守方式也各不相同
  • 所以当我拥有一个战士的集合时,我可以无视其具体类型,管你骑兵步兵还是法师弓箭手,都给劳资进攻,这就是调度它们的共性
  • 当敌人的大军来势汹汹时,最好的问候就是先给他们来一轮万箭齐发,这时我要从战士的集合里找出弓箭手这个具体实现,使用弓箭手的进攻方法(而非步兵的进攻方法因为无法满足需求),这就是调度它们的个性
  • 多态、共性与个性,使程序变得既丰富又简单

定义父类接口

//战士接口
type Soldier interface {
    Attack() (bloodLoss int)
    Defend()
}

定义子类实现一

//骑兵:战士的实现形态一
type Rider struct{}

//骑兵的进攻与防守
func (r *Rider) Attack() (bloodLoss int) {
    fmt.Println("发动战争践踏,撞死你,踩死你,扎死你")
    return 50
}
func (r *Rider) Defend() {
    fmt.Println("不能跑,我得快点走")
}

定义子类实现二

//法师:战士的实现形态二
type Master struct{}

//法师的进攻与防守
func (r *Master) Attack() (bloodLoss int) {
    fmt.Println("天崩地裂,电闪雷鸣,群星坠落,万籁俱寂,遍布下去了...")
    return 10000
}
func (r *Master) Defend() {
    fmt.Println("回城")
}

不同场景下,时而共性,时而个性

func main() {

    //定义一个战士的集合,加入不同的子类实现
    soldiers := make([]Soldier, 0)
    soldiers = append(soldiers, new(Rider))
    soldiers = append(soldiers, new(Master))

    //强调共性时
    fmt.Println("全体进攻")
    for _, f := range soldiers {
        //所有子类实现都调用共同的父类方法
        f.Attack()
    }

    //强调个性时
    fmt.Println("敌寇势大,法师进攻,骑士防守")
    for _, s := range soldiers {

        /*      //类型断言方式1
                switch s.(type) {
                case *Rider:
                    s.Defend()
                case *Master:
                    s.Attack()
                default:
                    fmt.Println("来了个什么鬼...")
                }*/

        //类型断言方式2
        //判断是当前s实例是不是骑士
        // 如果是:ok为true,riderPtr有值
        //如果不是:ok为false,riderPtr为nil
        if riderPtr, ok := s.(*Rider); ok {
            riderPtr.Defend()
        }
        //判断是当前s实例是不是法师
        // 如果是:ok为true,masterPtr有值
        //如果不是:ok为false,masterPtr为nil
        if masterPtr, ok := s.(*Master); ok {
            masterPtr.Attack()
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值