为了账号安全,请及时绑定邮箱和手机立即绑定

消除方法的重复

消除方法的重复

Go
翻阅古今 2021-09-10 10:14:51
是否可以重构以下代码以消除重复?我希望我的 GameObject 实现调用不同更新处理程序(如我的“AfterUpdate”)的“更新”任务的逻辑。当前版本有效,但“更新”有两种实现,它们是相同的。在 GameObject 上调用的 AfterUpdate 应该对其属性进行操作,在 HeroGameObject 上调用的 AfterUpdate 应该可以访问 HeroGameObject 的属性(例如“health”)。我可以做什么更好?谢谢你。package mainimport "fmt"type Point struct {    x, y int}///////////////////////type GameObject struct {    Point    title       string    status      int    ticks       float32    spriteIndex int}func (g *GameObject) Update() {    if g.ticks == 0 {               g.spriteIndex++        g.AfterUpdate()    }}func (g *GameObject) AfterUpdate() {    g.status = 0 //suppose it does something meaningful    fmt.Println("GameObject afterUpdate handler invoked")}///////////////////////type HeroGameObject struct {    GameObject    health float32}func (h *HeroGameObject) Update() {    if h.ticks == 0 {              h.spriteIndex++        h.AfterUpdate()    }}func (h *HeroGameObject) AfterUpdate() {    h.health-- //suppose it does something meaningful but *different*, using its own properties, for example "health"    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: 0,    }    gameObject.Update()    heroObject.Update()}输出:调用游戏对象 afterUpdate 处理程序调用 HeroGameObject afterUpdate 处理程序
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

像这样使用标志函数和基本接口怎么样?


type BaseGameObject interface {

    Ticks() int

    IncSpriteIndex()

    AfterUpdate()

}


func UpdateGameObject(o BaseGameObject) {

    if o.Ticks() == 0 {

        o.IncSpriteIndex()

        o.AfterUpdate()

    }

}


func (o *GameObject) Ticks() int {

    return o.ticks

}


func (o *GameObject) IncSpriteIndex() {

    o.spriteIndex++

}


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信