2011-08-02 90 views
0

假設我們有如下的僞代碼:通知對象

class XY 
{ 
    int X { get; set; } 
    int Y { get; set; } 
} 
class Foo 
{ 
    XY _xy; 
    XY xy 
    { 
     get 
     { 
      return _xy; 
     } 
     set 
     { 
      Write("Foo's XY is set!"); 
      _xy = value; 
     } 
    } 
} 

這工作得很好,只要我做

Foo foo; 
foo.xy = XY(1, 3); 
XY temp = foo.xy; 
temp.y = 5; 
foo.xy = temp; 

但不工作爲:

Foo foo; 
foo.xy = XY(1, 3); 
foo.xy.y = 5;  // no "Foo's XY is set!" here 

後者如何實現?具體來說,我的意思是Lua中(與_ 指數/ _newindex),但我正在寫在C#語言上下的示例代碼,因爲我想大多數人都知道它好,我相信這是比較通用的規劃問題。

回答

1

爲什麼呢?你沒有設置Foo.xy。如果你想實現這個目標,你應該實現某種通知給基礎對象。

在C#中,通用模式是在XY上實現INotifyPropertyChanged接口,並訂閱Foo

例子:

class XY: INotifyPropertyChanged 
{ 
    public X { get {...} set { _x = value; PropertyChanged("X"); }} 
    // implementation of interface... 
} 

class Foo 
{ 
    public Foo(XY xy) 
    { 
      this._xy = xy; 
      this._xy.PropertyChanged += delegate { Console.WriteLine("changed"); } 
    } 
} 
+0

謝謝!我在Lua中應用了類似的方法,複製了metatable並在__newindex末尾添加了「PropertyChanged」。 – John

0

你實際上是調用您的例子中,「吸氣」。這就是爲什麼你沒有看到你的輸出。

foo.xy.y = 5

你不更換參考變量,要檢索它。

+0

是的,我知道這一點。問題是後者與前者有相同的結果。 – John