golang中接口的面向对象(三)--go实现继承的局限

2023-10-12 09:38

本文主要是介绍golang中接口的面向对象(三)--go实现继承的局限,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接上一节golang中接口的面向对象(二)–继承,
在golang中,继承与聚合的区别是有点模糊的,我们先继续看一下golang继承:

在之前的例子中,circle 继承自rect类,rect类有三个方法sayHi()、area()以及perim()。
假设我们的circle 只重写了area()以及perim() 方法,没有重写sayHi()方法(也就是说,circle并没有实现geometry 接口类型,它是通过继承了rect获得了sayHi()方法),
那么我们做如下测试,在circle 的一个实例中调用sayHi(),
然后在sayHi()中我们又调用area(),会出现什么结果呢?

也就是这样一种情况,伪代码如下:

circle.sayHi() ----> rect.sayHi() ----> (?).area()

我们想知道(?)代表哪个类型的area()被调用。

那么我们来看一看如下的测试代码:

type geometry interface {sayHi() 
}type rect struct {len, wid float32
}func (r rect) sayHi() {   fmt.Println("i am a rect", r.area())   //rect的sayHi()中调用area()
}func (r rect) area() float32 {fmt.Println("area", r.len, "*", r.wid)  //对rect的area()增加打印return r.len * r.wid
}func (r rect) perim() float32 {return 2 * (r.len + r.wid)
}type circle struct {rect                                //这里circle 继承了 rect的属性len, wid 以及方法sayHi、area、perimradius float32
}/* func (c circle) sayHi() {           //我们删除circle对sayHi的重写fmt.Println("i am a circle")
}*/func (c circle) area() float32 {            //这里circle 重写了 area方法return math.Pi * c.radius * c.radius
}func (c circle) perim() float32 {         //这里circle 重写了 perim方法return 2 * math.Pi * c.radius
}

然后我们简化main函数,测试如下:

func main() {var ige geometry // 基类,子集var icir circleicir.len = 0icir.wid = 0icir.radius = 1ige = icirfmt.Printf("ige addr is %x\n", &ige)ige.sayHi()show("circle", ige)
}

输出:

ige addr is c000032250
area 0 * 0                        //说明rect的area()被调用,而不是circle的area()
i am a rect 0
area 3.141592653589793 * 1 * 1
[c]area of circle is 3.1415927 
[c]perim of circle is 6.2831855 

感兴趣的同学可以使用java来验证同样的操作,你会发现java代码运行的结果与go是不同的,
在java中,同样的测试会调用到circle的area(),大家可以思考一下。

这篇关于golang中接口的面向对象(三)--go实现继承的局限的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194955

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1