消除方法的重复

是否可以重构以下代码以消除重复?


我希望我的 GameObject 实现调用不同更新处理程序(如我的“AfterUpdate”)的“更新”任务的逻辑。当前版本有效,但“更新”有两种实现,它们是相同的。在 GameObject 上调用的 AfterUpdate 应该对其属性进行操作,在 HeroGameObject 上调用的 AfterUpdate 应该可以访问 HeroGameObject 的属性(例如“health”)。


我可以做什么更好?谢谢你。


package main


import "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 处理程序


翻阅古今
浏览 139回答 1
1回答

至尊宝的传说

像这样使用标志函数和基本接口怎么样?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++}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go