多态

  • 多态:同一件事情由于条件不同产生的结果不同

  • 由于Go语言中结构体不能相互转换,所以没有结构体(父子结构体)的多态,只有基于接口的多态.这也符合Go语言对面向对象的诠释

  • 多态在代码层面最常见的一种方式是接口当作方法参数

代码示例

  • 结构体实现了接口的全部方法,就认为结构体属于接口类型,这是可以把结构体变量赋值给接口变量

  • 重写接口时接收者为Type*Type的区别

    • *Type可以调用*TypeType作为接收者的方法.所以只要接口中多个方法中至少出现一个使用*Type作为接收者进行重写的方法,就必须把结构体指针赋值给接口变量,否则编译报错

    • Type只能调用Type作为接收者的方法

复制代码
type Live interface {
    run()
    eat()
}
type People struct {
    name string
}

func (p *People) run() {
    fmt.Println(p.name, "正在跑步")
}
func (p People) eat() {
    fmt.Println(p.name, "在吃饭")
}

func main() {
    //重写接口时
    var run Live = &People{"张三"}
    run.run()
    run.eat()
}
复制代码
  • 既然接口可以接收实现接口所有方法的结构体变量,接口也就可以作为方法(函数)参数
复制代码
type Live interface {
    run()
}
type People struct{}
type Animate struct{}

func (p *People) run() {
    fmt.Println("人在跑")
}
func (a *Animate) run() {
    fmt.Println("动物在跑")
}

func sport(live Live) {
    fmt.Println(live.run)
}

func main() {
    peo := &People{}
    peo.run() //输出:人在跑
    ani := &Animate{}
    ani.run() //输出:动物在跑
}
复制代码

 

posted on   不要挡着我晒太阳  阅读(117)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示