【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())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统概述选择简答概念复习

目录 一、组成数据库的三要素 二、关系数据库特点 三、三级模式、二级映像 四、视图和审计提供的安全性 审计(Auditing) 视图(Views) 五、grant、revoke GRANT REVOKE 六、三种完整性 实体完整性 参照完整性 自定义完整性 七、事务的特性ACDI 原子性(Atomicity)…

大模型系列:提示词管理

既然大模型应用的编程范式是面向提示词的编程,需要建立一个全面且结构化的提示词库, 对提示词进行持续优化也是必不可少的,那么如何在大模型应用中更好的管理提示词呢? 1. 提示词回顾 提示词在本质上是向大型语言模型(…

基于Spring Boot的工具迭代

1. 申请git权限 2. git项目中点击我的-Settings-SSH Keys添加公钥 3. 公钥生成步骤 ssh-keygen -o -t rsa -b 4096 -C "your email" cd ~/.ssh/ cat id_rsa.pub 把公钥内容粘贴到SSH Keys 4. 创建本地分支git checkout -b branchname git远程仓库创建远程分支 …

stm32f103 HAL库 HC-SR04测距

目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…

vue部署宝塔nginx配置(获取用户ip地址、反代理访问api接口、websocket转发)

以下配置为我自己的需求,因人而异,如果只是单纯的前端非交互页面,可以不用修改配置。 代码及注释,如下: #解决vue-router设置mode为history,去掉路由地址上的/#/后nginx显示404的问题location / {proxy_htt…

多模态大模型通用模式

MM-LLMs(多模态大模型)是目前比较新的和实用价值越发显著的方向。其指的是基于LLM的模型,具有接收、推理和输出多模态信息的能力。这里主要指图文的多模态。 代表模型:GPT-4o、Gemini-1.5-Pro、GPT-4v、Qwen-VL、CogVLM2、GLM4V、…

Ptrade和QMT的区别,怎么获取合适的量化交易软件?

​Ptrade和QMT的适用人群 交易活跃用户 量化爱好者已经专业量化投资者 高净值个人或机构 Ptrade和QMT的区别 回测和交易频率 Ptrade回测和交易只支持分钟级和日线级别的频率,而QMT支持tick级、分钟级、5分钟级、10分钟级、日线、周线、月线等。 使用QMT进行回…

Docker overlay磁盘使用100%处理方法overlay 100%

一、问题描述 服务器上运行了几个docker容器,运行个一周就会出现overlay 100%的情况,经查找,是容器里生成了很多core.xxx的文件导致的。 二、解决方法 首先通过以下命令查看: df -h 可以看的overlay已经100%了,进入到/var/lib/d…

计算机网络实验(9):路由器的基本配置和单臂路由配置

一、 实验名称 路由器的基本配置和单臂路由配置 二、实验目的: (1)路由器的基本配置: 掌握路由器几种常用配置方法; 掌握采用Console线缆配置路由器的方法; 掌握采用Telnet方式配置路由器的方法&#…

Java | Leetcode Java题解之第148题排序链表

题目: 题解: class Solution {public ListNode sortList(ListNode head) {if (head null) {return head;}int length 0;ListNode node head;while (node ! null) {length;node node.next;}ListNode dummyHead new ListNode(0, head);for (int subL…

26 种 prompt 套路,驯服大模型

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

封装音视频编解码和渲染的动态链接库编译和测试

1.动态链接库的编译 生成了以下几个文件 我们把生成的lib文件复制到lib文件夹中 其余三个文件不变动 2.进行测试看是否可以用生成的xcodec.lib库文件里的接口函数 以上是重新创建的新项目,导入了xcodec.lib,其他配置同以前项目 库测试结果 运行显示我们…

qt登录和闹钟实现

qt实现登录 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 去掉头部this->setWindowFlag(Qt::FramelessWindowHint);// 去掉空白部分this->s…

栈(Stack)

目录 一.栈(Stack) 1.概念 2.栈的使用 3.栈的模拟实现 二.栈相关习题 1.逆波兰表达式求值 (1)链接 (2)解析 (3)题解 2.括号匹配 (1)链接 &#xff…

计算机网络——传输层重要协议(TCP、UDP)

一、常见名词解释 IP地址:IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址,即IP地址用于定位主机的网络地址; IP地址是一个32位的二进制数,通常被分割为4个 8位⼆进制数(也就是…

构建基于 LlamaIndex 的RAG AI Agent

I built a custom AI agent that thinks and then acts. I didnt invent it though, these agents are known as ReAct Agents and Ill show you how to build one yourself using LlamaIndex in this tutorial. 我构建了一个自定义的AI智能体,它能够思考然后行动。…

京东618 :AI总裁数字人、京东Apple Vision Pro版亮相

2004年6月18日,刚刚转型电商才半年的京东,用最互联网的方式为忠实粉丝打造了一场价格降到“难以置信”的店庆促销活动,这场促销活动还有一个很具有当年网络小说特质的名字——“月黑风高”。 2024年京东618,早已成为一场亿万消费…

泛微开发修炼之旅--20关于Ecology中如何查询正文文件的物理文件,并修改正文中的内容的解决方案

文章链接地址:20关于Ecology中如何查询正文文件的物理文件,并修改正文中的内容的解决方案

Linux系统编程——网络编程

目录 一、对于Socket、TCP/UDP、端口号的认知: 1.1 什么是Socket: 1.2 TCP/UDP对比: 1.3 端口号的作用: 二、字节序 2.1 字节序相关概念: 2.2 为什么会有字节序: 2.3 主机字节序转换成网络字节序函数…

C语言程序设计-10 指针

指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样 处理内存地址,从而编出精练而高效的程序。指针极大地…