当前位置: 首页 > news >正文

【Go语言】面向对象编程(二):通过组合实现类的继承和方法重写

通过组合实现类的继承和方法重写

要实现面向对象的编程,就必须实现面向对象编程的三大特性:封装、继承和多态。

1 封装

类的定义及其内部数据的定义可以看作是类的属性,基于类定义的函数方法则是类的成员方法。

2 继承

Go 语言中,没有直接提供继承相关的语法实现,可以通过 组合 的方式间接实现类似的功能,所谓组合,就是将一个类型嵌入到另一个类型,从而构建新的类型结构。

具体实现如下所示:

  1. 定义一个基础的类 Animal,其中定义了 Name 属性以及 CallFavorFoodGetName 成员方法。

    type Animal struct {Name string
    }func (a Animal) Call() string {return "动物的叫声..."
    }
    func (a Animal) FavorFood() string {return "爱吃的食物..."
    }
    func (a Animal) GetName() string {return a.Name
    }
    
  2. 定义一个新的类 Dog,继承 Animal 类的属性和成员方法。

    type Dog struct {Animal
    }
    
  3. main 方法中对 AnimalDog 进行调用测试。

    animal := GoClass.Animal{"中华田园犬"}
    dog := GoClass.Dog{animal}
    fmt.Println(dog.GetName())
    fmt.Println(dog.Call())
    fmt.Println(dog.FavorFood())
    

    在这里插入图片描述

3 多态

这里重写方法 FavorFoodCall,如下所示:

func (d Dog) FavorFood() string {return "骨头"
}
func (d Dog) Call() string {return "汪汪汪"
}

main 方法中进行调用,如下所示:

fmt.Print(dog.Animal.Call())
fmt.Println(dog.Call())
fmt.Print(dog.Animal.FavorFood())
fmt.Println(dog.FavorFood())

在这里插入图片描述

4 其他问题
4.1 多继承同名方法冲突处理

需要注意组合的不同类型之间包含同名方法,比如 AnimalPet 都包含了 GetName 方法,如果子类 Dog 没有重写该方法,直接在 Dog 实例上调用的话会报错:

func main() {animal := Animal{"中华田园犬"}pet := Pet{"宠物狗"}dog := Dog{animal, pet}fmt.Println(dog.GetName())
}

在这里插入图片描述

需要显式的指定调用那个父类的方法,修改如下则不报错:

func main() {animal := Animal{"中华田园犬"}pet := Pet{"宠物狗"}dog := Dog{animal, pet}fmt.Println(dog.GetName())
}

在这里插入图片描述

4.2 为组合类型设置别名

能够设置继承父类的名称,示例如下:

type Dog struct {Animal *GoClass.AnimalPet    *GoClass.Pet
}animal := GoClass.Animal{"中华田园犬"}
pet := GoClass.Pet{"宠物狗"}
dog := Dog{&animal, &pet}
fmt.Println(dog.Pet.GetName())
fmt.Println(dog.Animal.GetName())

在这里插入图片描述

相关文章:

  • 【深度学习】数竹签演示软件系统
  • vue3 基于el-tree增加、删除节点(非TypeScript 写法)
  • 深入解读Prometheus Adapter:云原生监控的核心组件
  • 生成式人工智能 - stable diffusion web-ui安装教程
  • Struts2 系列漏洞 - S2-003、S2-005
  • 蓝桥杯物联网竞赛_STM32L071KBU6_第十五届蓝桥杯物联网竞赛国赛代码解析
  • Shell脚本
  • Web前端开发 - 5 - JavaScript基础
  • 滴滴出行 大数据研发实习生【继任】
  • Direct local .aar file dependencies are not supported when building an AAR.
  • 算法之分治
  • java 中for、while循环
  • Apache Hadoop的核心组成及其架构
  • 气膜建筑在体育和娱乐行业的多样化应用—轻空间
  • 小程序视图渲染数据和部分事件的绑定
  • Bytom交易说明(账户管理模式)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • github从入门到放弃(1)
  • go append函数以及写入
  • Hibernate最全面试题
  • jquery cookie
  • mysql innodb 索引使用指南
  • node-glob通配符
  • Promise面试题,控制异步流程
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 检测对象或数组
  • 模型微调
  • 如何实现 font-size 的响应式
  • 数组的操作
  • 一个JAVA程序员成长之路分享
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # .NET Framework中使用命名管道进行进程间通信
  • # wps必须要登录激活才能使用吗?
  • # 数仓建模:如何构建主题宽表模型?
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (计算机网络)物理层
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十六)、把镜像推送到私有化 Docker 仓库
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)重识new
  • (转载)hibernate缓存
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • . NET自动找可写目录
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET WPF 抖动动画
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型