2

我的游戏开发框架有一个Point类(商店xy坐标和其他有用的东西)。我的游戏对象有一个@position属性,它是一个Point实例。当@position被修改时,游戏对象将被绘制到其他地方。

我的问题是这样的:

@someSprite.position = Point.new(100,100)
temp = @someSprite.position
temp.x = 500

temp成为 的参考@someSprite.position。修改它也会改变精灵的位置。这是我不想要的。我想temp成为一个不同的例子。

我不能做这样的事情:

temp = @someSprite.position.clone

因为框架中的另一个细节:Pointis observable@someSprite正在观察自己的属性,@someSprite.position

如果我使用clone, thentemp也会克隆观察者注册表。并且当temp's 的状态发生变化时,@someSprite会收到通知,造成混乱。

那时可以这样做:

temp = @someSprite.position.clone
temp.remove_observer(@someSprite)

但这让人感觉不切实际和骇人听闻。

另一种方法是:

temp = Point.new(@someSprite.position)

我在其中创建了一个构造函数,用于Point从另一个获取值的位置Point(不复制观察者注册表)。这听起来是迄今为止最好的方法,但我想要实现的是

temp = @someSprite.position

这可以做到吗?在这种情况下,我可以覆盖赋值运算符的行为吗?

4

3 回答 3

1

我假设您正在使用attr_readeron@position来定义position精灵的方法。但是您也可以定义自己的吸气剂。在这种情况下,我建议您为该职位创建一个明确的 getter:

class Sprite
    def position
        return Point.new(@position.x, @position.y)
    end
end

很少需要引用精灵在对象中的位置而不是其值的副本;暴露一个类的私有成员实际上是非常危险的。

于 2013-07-14T00:38:25.223 回答
1

你解释了为什么你不能使用clone,但这并不意味着你不能覆盖clone或创建一个新的方法,比如duplicate.

所以在你的 Point 类上定义:

def duplicate
  Point.new(x,y)
end

然后你可以这样做:

temp = @someSprite.position.duplicate
于 2013-07-13T23:57:17.063 回答
0

Ruby 是开源的,所以当然,您可以覆盖赋值运算符,只需一点点语言知识C。但我不建议这样做。

于 2013-07-14T01:33:25.757 回答