2011-07-07 53 views
-1

对于基于组件的实体,我有一个属性在所有组件之间共享的字典......像位置,速度,健康等等。我遇到问题通知组件时,属性更改,但仅与非固有类型...如何通知组件的非内在类型已更改的属性/属性

见这个例子:

public class AttributeVector2D extends Attribute 
{ 
    protected var _value : Vector2D; 

    public function get value() : Vector2D { return _value; } 
    public function set value(data : Vector2D) : void { _value = data; _owner.attributeChanged(_id); } 

    public function AttributeVector2D() : void 
    { 
     super(); 

     _value = new Vector2D(0, 0); 
    } 
} 

(有没有模板/在Flash中的仿制药,所以我知道这将是更漂亮了很多与他们)

问题是如果你只是这样做...... value.x = 320,这是使用getter属性,而不是setter属性,并且所有者永远不会收到更改的通知。这只是非内在类型的一个问题。

除了更改它,所以你必须复制像setX()setY()setXY()(其中Vector2D类已经定义)功能,有另一种清洁的解决方案?

谢谢!

+0

我会改变这篇文章的标题,以避免使用“通知”一词,我认为这意味着我们正在谈论消息或事件模型。这个问题实际上只是处理由属性返回的值类型。另外,我认为“价值型”比“非内在型”更为普遍。 –

+0

哎呀对不起,我以为内在的意思就像int,float,boolean等等...不是类。我的错。 –

+0

好的,我误解了你的问题。你真的在谈论通知。我没有滚动到右侧,看看你的setter调用了attributeChanged。我会发布一个新的答案... –

回答

0

这里有两个干净的解决方案:要么实现Vector2D不可变,要么让它自己通知对属性的更改。如果Vector2D是不可变的(可能是一个值类型,即struct),那么为了修改它,你必须调用类似myObj.Position = new Vector(124, myObj.Position.Y)的设置器。这有一个明显的缺点,就是令人讨厌,但重用所有Vector2D功能的优势(例如:myObj.Position = myObj.Position.dotProduct(anotherVector))。另一个是让Vector2D实现它自己的通知。如果Vector2D可以在修改它时通知其他对象,那么只要注册接收通知,只要调用者使用非空值进行调用。如果你不拥有Vector2D,这两种方法都不能工作,因此无法根据你的需要进行调整,在这种情况下,当有人检索到值时,你应该制作一份Vector2D的副本,并记录他们必须调用setter以修改它。这很丑陋,但它是这样的。