GO语言自学_014_多态

多态划重点
1、定义一个接口,里面设计好需要的接口,可以有多个。
2、任何实现了这个接口的类型,都可以赋值给这个接口,从而实现多态。
3、多个类之间,不需要有继承关系。
4、如果接口中定义了多个接口,那么实际类必须全部实现接口函数,才可以赋值。
代码
package main

import "fmt"

/*
  一、
  C语言的多态:需要父子关系
  GO语言多态:不需要继承,只要实现相同的接口即可
  二、
  实现多态,首先需要定义接口。
  我们这里创建一个人:人的武器发起攻击,不同等级武器效果不同。
*/

// IAttack 1、创建一个接口,类型是interface
type IAttack interface {
  // Attack1 接口的函数,(接口函数可以多个,但只可以有原型,不可以有实现。)
  Attack1()
  Attack2()
  //Attack3()
}

// HumanLowLevel 2、低等级结构体
type HumanLowLevel struct {
  name   string
  level  int
  damage int
}

// HumanHiLevel 2-1、高等级结构体
type HumanHiLevel struct {
  name   string
  level  int
  damage int
}

// Attack1 3-1、绑定方法
func (a *HumanLowLevel) Attack1() {
  fmt.Println("这个来自霍比特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}

// Attack2 3-2、绑定方法
func (a *HumanLowLevel) Attack2() {
  fmt.Println("这个来自比尔吉沃特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}

// Attack1 3-3、绑定方法
func (a *HumanHiLevel) Attack1() {
  fmt.Println("这个来自霍比特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}

// Attack2 3-4、绑定方法
func (a *HumanHiLevel) Attack2() {
  fmt.Println("这个来自比尔吉沃特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}

/*
我们进一步简化:
定义一个堕胎的通用接口,传入不同的对象,调用同样的方法,实现不同效果。 => 多态
*/

func DoAttack(a IAttack) {
  a.Attack1()
  a.Attack2()
}

func main() {

  lowLevel := HumanLowLevel{
    name:   "大潘儿",
    level:  1,
    damage: 1000,
  }

  hiLevel := HumanHiLevel{
    name:   "大嫚儿",
    level:  10,
    damage: 100000,
  }

  // 调用
  fmt.Println("========== 通过方法直接调用 ==========")
  lowLevel.Attack1()
  hiLevel.Attack2()

  /*
    定义一个包含Attack的接口变量
  */
  fmt.Println("========== 通过接口进行调用 ==========")
  // 同样一个接口player,赋值不同的对象(这里是不同方法),结果/效果不同。这就是多态。
  var player IAttack
  // player赋值为lowLevel,接口需要指针类型来赋值
  player = &lowLevel
  // 调用
  player.Attack1()
  player.Attack2()
  // player赋值为hiLevel,接口需要指针类型来赋值
  player = &hiLevel
  // 调用
  player.Attack1()
  player.Attack2()

  fmt.Println("========== (最终方式)通过接口进行调用 ==========")
  DoAttack(&lowLevel)
  DoAttack(&hiLevel)
}

结果
ASUS@DESKTOP-NFP9SLA MINGW64 /c/gowork/src
$ go run 013_polymorphism.go 
========== 通过方法直接调用 ==========
这个来自霍比特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000
========== 通过接口进行调用 ==========
这个来自霍比特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自比尔吉沃特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自霍比特的人是: 大嫚儿 等级: 10 伤害: 100000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000
========== (最终方式)通过接口进行调用 ==========
这个来自霍比特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自比尔吉沃特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自霍比特的人是: 大嫚儿 等级: 10 伤害: 100000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000

posted @ 2022-09-07 17:32  顺心无忧  阅读(44)  评论(0编辑  收藏  举报