首页 > 其他分享 >Go组合与继承

Go组合与继承

时间:2024-01-16 20:16:14浏览次数:24  
标签:Name 组合 继承 ClassB ClassA PrintName Go

转载:原文链接

Golang是不支持继承的,因此我们在使用的时候往往使用组合。那么,组合与继承有什么区别呢?组合和继承都是面向对象编程中重要的概念。继承让一个类获得另一个类的属性和方法,形成层级关系,子类可以重用父类的功能。而组合则是将一个类的对象作为另一个类的成员变量,实现代码复用和模块化。继承建立的是"is-a"关系,表示一种类型的扩展;而组合则是"has-a"关系,表示对象之间的包含关系。相比继承,组合更加灵活,降低了类之间的耦合度,使得代码更易于维护和扩展。当然,Golang中,可以让父组件直接获取子组件的公开函数和公开属性。但是子组件和父组件之间依然是隔离的。

看一下如下例子:

package main
import "fmt"
type ClassA struct {}
func (a ClassA) Name() string {  return "ClassA"}
func (a ClassA) PrintName() {  fmt.Printf("I am %s", a.Name())}
type ClassB struct {  ClassA}
func (b ClassB) Name() string {  return "ClassB"}
func main() {  var obj = new(ClassB)  obj.PrintName()}

看似,我们想让classB继承classA,并重写了Name方法。但实际上,classB只是覆盖了Name方法,而没有重写他,对于classB里面的classA,其仍然与classB隔离。当classA访问Name方法时,不会用到classB的Name方法,依然是classA的Name方法。这一点与C++的非虚函数比较相似。这是组合很典型的一个特征:隔离。

为什么会写出上面的代码呢?因为我们误把组合当继承了。ClassB与ClassA的关系不是is-a,也就是ClassB不是ClassA的一种。相反,ClassB拥有了ClassA,他们是has-a关系。也就是ClassA的Name函数和CLassB的Name函数没有关系。就相当于菜篮子里面有苹果,菜篮子有自己的名字,苹果也有自己的名字。那么PrintName函数是属于ClassA的,他打印的是ClassA的名字,那当然和ClassB的Name没关系。只不过我们错误的使用了一些魔法,让原本应该为obj.ClassA.PrintName的方法变成了obj.PrintName。

那么,什么时候我们需要用到匿名属性(类似继承)的这种魔法呢?在我们定义一些结构体时,他们具有相同的属性,并且这些属性与其他属性相对较为隔离。

常见的,我们定义web的返回形参类型:

type Resp {  code int64  msg string}
type LoginResp {  Resp  Data {某种结构}}
type RegisterResp {  Resp  Data {某种结构}}

正如上面,Resp每次请求都会返回的内容,而且其与Data在行为上基本上没有关联。

Go在这方面确实与C更为接近,而不是与C++或者Java更为接近。

标签:Name,组合,继承,ClassB,ClassA,PrintName,Go
From: https://www.cnblogs.com/Huan0630/p/17968435

相关文章

  • Google自研芯片首次交给台厂生产 | 百能云芯
    Google半导体战略有了新的走向,首次将其自家设计的手机系统单晶片(SoC)"Tensor"的测试订单委托给了台湾的京元电。这一举动打破了以往三星包揽晶圆代工与封测的模式,同时也为未来Google可能释出更多自家设计的人工智能(AI)芯片测试订单留下伏笔,象征着台湾在全球AI芯片供应链中的地位不断......
  • argo-rollout使用--金丝雀结合ingress-nginx
    1.金丝雀发布流程,安装比例发布,又名灰度发布举例:共10pod第一批发布30%V1:10个PodV2:3个Pod第二批发布60%V1:10个PodV2:6个Pod第三批发布100%V1:10个PodV2:10个Pod第四批发布V2:10个Pod(active)V1:0个Pod 2.资源文件准备文......
  • 以 Golang 为例详解 AST 抽象语法树
    前言各位同行有没有想过一件事,一个程序文件,比如hello.go是如何被编译器理解的,平常在编写程序时,IDE又是如何提供代码提示的。在这奥妙无穷的背后,AST(AbstractSyntaxTree)抽象语法树功不可没,他站在每一行程序的身后,默默无闻的工作,为繁荣的互联网世界立下了汗马功劳。AST抽象......
  • Django 使用swagger自定义自动生成类
    完整代码:https://gitee.com/mom925/django-system之前写的Django配置swagger(https://www.cnblogs.com/moon3496694/p/17657283.html)其实更多还是自己手动的写代码去书写接口文档,我希望它能更加的自动化生成出接口文档,所以我需要自己重写一些函数。安装所需的包,注册app,注册路由参考......
  • Gorm常见映射关系查询实例
    一、概述本小节主要罗列一下常见的查询以及相应的代码示例1.假设你有一个轮播图表,请查询出轮播图中的所有记录2.获取后台管理用户列表,并把用户的角色信息也查询出来3.查询用户订单信息,要求:查询某用户买了某商品的订单信息。本例是查询用户购买的视频的详细的......
  • GOrm多对多(关联查询)
    一、概述现有两张表,一张表代表章节(chapter)、另外一张表代表集(episode)。一个章节中包含多集,一个集中有可能有视频也有可能没有视频,视频表(video)。表结构如下:1.章节表(chapter),ps:一个章节中包含了多集2.集表(episode),集中有视频3.视频表(video) 要求:查......
  • Go+Gin+GOrm+MySql实现基础的增删改查
    一、概述本节使用Gin+GOrm+MySql实现基础的增删改查。主要是做一下记录防止后面忘记了可以翻看博客查看主要有两个.go文件1.main.go用于注册gin路由及初始化gorm操作数据库2.Result.go用于封装服务端返回给客户端的响应体二、代码示例1.main.go//go_......
  • 基于标签值分布的强化学习推荐算法(Reinforcement Learning Recommendation Algorithm
    前言看论文的第三天,坚持下去。慢慢来,比较快。——唐迟本文基于2023年6月28日发表在MATHEMATICS上的一篇名为“基于标签值分布的强化学习推荐算法”(ReinforcementLearningRecommendationAlgorithmBasedonLabelValueDistribution)的文章。文章提出了一种基于标签分布......
  • Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程
    前言  本篇安装高云的开发软件Gowin,并且描述了一个基于高云fpga的程序的开发环境和完整的下载运行过程。 Gowin软件概述  Gowin软件是广东高云半导体股份有限公司的FPGA开发软件。下载地址  http://www.gowinsemi.com.cn    申请license......
  • Django中安装websocket
    完整代码:https://gitee.com/mom925/django-system项目结构:先安装所需库:pipinstallchannels下面将websocket作为插件一样的只需要引入配置的结构asgi.py文件http请求不变、修改websocket请求调用路径importosimportdjangofromchannels.httpimportAsgiHandlerfr......