关于设置属性成员的通知对象

假设我们有以下伪代码:

class XY
{
    int X { get; set; }
    int Y { get; set; }
}
class Foo
{
    XY _xy;
    XY xy
    {
        get
        {
            return _xy;
        }
        set
        {
            Write("Foo的XY被设置了!");
            _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; // 这里没有 "Foo的XY被设置了!"

如何实现后者?具体来说,我指的是Lua(带有__index/__newindex),但我正在用类似C#的语言编写示例代码,因为我认为大多数人都很熟悉它,而且我相信这是一个更通用的编程问题。

原文链接 https://stackoverflow.com/questions/6918673

点赞
stackoverflow用户189475
stackoverflow用户189475

将下面翻译成中文并且保留原本的 markdown 格式

你在示例中实际上是调用了“getter”。这就是为什么你没有看到输出。

foo.xy.y = 5

你没有替换变量的引用,而是检索它。

2011-08-02 21:14:52
stackoverflow用户283975
stackoverflow用户283975

为什么不行呢?你没有设置 Foo.xy。如果你想要实现这个功能,应该在基对象上实现某种通知机制。

在 C# 中,常见的模式是在 XY 上实现 INotifyPropertyChanged 接口,并将 Foo 订阅到它上面。

示例代码:

class XY : INotifyPropertyChanged
{
    public X { get {...} set { _x = value; PropertyChanged("X"); }}
    // 接口实现...
}

class Foo
{
     public Foo(XY xy)
     {
          this._xy = xy;
          this._xy.PropertyChanged += delegate { Console.WriteLine("changed"); }
     }
}
2011-08-02 21:16:05