本文介绍如何利用 go 的接口抽象与函数复用机制,消除 gameobject 及其子类型中重复的 update 实现,同时保持各类型对自身字段(如 health)的专属访问能力。
在 Go 这类不支持传统继承的语言中,当多个结构体需共享相同控制逻辑(如 Update() 的调度流程),但又需各自实现差异化业务行为(如 AfterUpdate() 对不同字段的操作)时,直接复制 Update 方法不仅违反 DRY 原则,更增加维护成本和出错风险。
上述代码中,GameObject 和 HeroGameObject 的 Update 方法完全一致:检查 ticks == 0 → 自增 spriteIndex → 调用 AfterUpdate()。真正的差异仅在于 AfterUpdate() 的具体实现及其所操作的字段(status vs health)。因此,将通用调度逻辑上提为独立函数、将差异化行为抽象为接口方法,是最符合 Go 习惯的解法。
我们定义一个轻量接口 BaseGameObject,仅声明三个必需行为:获取 ticks 值、更新 sprite 索引、执行后置逻辑:
type BaseGameObject interface {
Ticks() float32 // 注意:原代码中 ticks 是 float32,接口应保持类型一致
IncSpriteIndex()
AfterUpdate()
}接着,将重复的调度逻辑提取为一个纯函数:
func UpdateGameObject(o BaseGameObject) {
if o.Ticks() == 0 {
o.IncSpriteIndex()
o.AfterUpdate()
}
}然后,让 GameObject 和 HeroGameObject 分别实现该接口——无需重写 Update,只需提供接口要求的方法即可:
func (g *GameObject) Ticks() float32 { return g.ticks }
func (g *GameObject) IncSpriteIndex() { g.spriteIndex++ }
func (g *GameObject) AfterUpdate() {
g.status = 0
fmt.Println("GameObject afterUpdate handler invoked")
}
func (h *HeroGameObject) Ticks() float32 { return h.ticks } // 继承自嵌入字段,可直接转发
func (h *HeroGameObject) IncSpriteIndex() { h.spriteIndex++ }
func (h *HeroGameObject) AfterUpdate() {
h.health-- // ✅ 直接访问 HeroGameObject 特有字段
fmt.Println("HeroGameObject afterUpdate handler invoked")
}最终调用方式简洁清晰:
func main() {
gameObject := &GameObject{
Point: Point{x: 0, y: 0},
title: "dummy object",
status: 0,
ticks: 0,
spriteIndex: 0,
}
heroObject := &HeroGameObject{
GameObject: GameObject{
Point: Point{x: 0, y: 0},
title: "hero object",
status: 0,
ticks: 0,
spriteIndex: 0,
},
health: 100,
}
UpdateGameObject(gameObject) // 统一入口,自动分发到对应 AfterUpdate
UpdateGameObject(heroObject)
}原问题中提出的 SetHandler(gameObject) 方案虽能工作,但存在明显缺陷:
相比之下,BaseGameObject 接口方案:
消除重复的关键不是“把逻辑塞进父类”,而是识别共性行为、抽象为接口、将控制流外置为函数。这种模式在游戏开发、事件驱动系统、状态机等场景中广泛适用。记住 Go 的信条:“Accept interfaces, return structs.” —— 让函数依赖接口,让具体类型专注实现,代码自然清晰、健壮、可扩展。
# go
# 处理器
# ai
# 游戏开发
# 封装
# 父类
# 子类
# 结构体
# 继承
# 接口
# 对象
# 事件
# this
# 只需
# 差异化
# 多个
# 这类
# 不清
# 外置
# 重写
# 不支持
# 但又
# 可直接
相关文章:
如何用5美元大硬盘VPS安全高效搭建个人网站?
网站微信制作软件,如何制作微信链接?
家庭服务器如何搭建个人网站?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
成都网站制作报价公司,成都工业用气开户费用?
建站与域名管理如何高效结合?
建站DNS解析失败?如何正确配置域名服务器?
网站专业制作公司有哪些,做一个公司网站要多少钱?
建站168自助建站系统:快速模板定制与SEO优化指南
如何正确选择百度移动适配建站域名?
建站之星后台密码遗忘?如何快速找回?
PHP 500报错的快速解决方法
建站之星图片链接生成指南:自助建站与智能设计教程
头像制作网站在线制作软件,dw网页背景图像怎么设置?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
三星网站视频制作教程下载,三星w23网页如何全屏?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何在Golang中指定模块版本_使用go.mod控制版本号
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
如何高效完成自助建站业务培训?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
制作网站的模板软件,网站怎么建设?
*服务器网站为何频现安全漏洞?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何快速生成可下载的建站源码工具?
建站之星后台密码遗忘或太弱?如何重置与强化?
如何快速辨别茅台真假?关键步骤解析
专业商城网站制作公司有哪些,pi商城官网是哪个?
C#怎么使用委托和事件 C# delegate与event编程方法
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
制作电商网页,电商供应链怎么做?
建站之星免费版是否永久可用?
如何在阿里云服务器自主搭建网站?
h5网站制作工具有哪些,h5页面制作工具有哪些?
青岛网站建设如何选择本地服务器?
如何快速启动建站代理加盟业务?
网站制作企业,网站的banner和导航栏是指什么?
建站主机选购指南:核心配置与性价比推荐解析
制作网站公司那家好,网络公司是做什么的?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
济南专业网站制作公司,济南信息工程学校怎么样?
如何挑选最适合建站的高性能VPS主机?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
网站制作公司排行榜,抖音怎样做个人官方网站
ui设计制作网站有哪些,手机UI设计网址吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。