reflection - 在 D 中透明地同步对象中的任意属性

标签 reflection synchronization operator-overloading d

假设我有这样一个类:

class Gerbil{
    int id;
    float x,y,z;
}

让我们进一步说这是实时模拟的一部分,我有一个服务器/客户端设置,我在服务器端更改了一个属性:

//...
gerbil.x = 9.0;
//...

现在我想将此更改发送到客户端以同步世界状态。然而,问题是我可能有大量的沙鼠,而这些沙鼠也可能有很长的属性列表——不仅仅是这里描述的 x、y、z。

我的问题是:有没有一种方法可以透明地拦截这些属性分配,并根据它们编译差异?

通过阅读 D 引用资料,我得到的印象是 opAssign 可能是正确的,只是实际上没有关于如何使用它的示例? ( D Ref. / opAssign ) 我想它看起来像这样,但我只是从臀部射击:

void opAssign(string name)(float val){ //Just guessing here
     if(name in floatProps){
         if(isServer){
             changedProps.push(this.id, name, val);
         }
         floatProps[name] = val;
     }
}

然后当我们这样做时将调用 opAssign:

gerbil.x = 9.0; //Same as  gerbil.opAssign!("x")(9.0)  ??

除了可能错误的语法之外,这是朝着正确方向迈出的一步吗?什么是正确的语法?性能怎么样?看起来它可能很慢?有没有更快、更“直接”的方法?

我在这里真正想避免的是精心设计的设置,例如:

gerbil.incProp(Prop.X, 9.0);

感谢您的宝贵时间。

最佳答案

基于 Jonathan 的回答,我在我的许多库中使用了这样的代码:

public template property(string name, T) {
    mixin(`protected T _`~name~`;` ~
      propertyGetter!(name, T) ~ propertySetter!(name, T));
}
public template property(string name, T, T def)
{
   mixin(`protected T _`~name~` = `~def.stringof~`;` ~
      propertyGetter!(name, T) ~ propertySetter!(name, T));
}
template propertyGetter(string name, T) {
    enum propertyGetter = `public T `~name~`(){ return _`~name~`; }`;
}
template propertySetter(string name, T) {
    enum propertySetter = `public typeof(this) `~name~`(T value){ _`~name~` = value;`~
              `/* notify somebody that I've changed here */`~
              `return this; }`;
}

mixin 字符串有点难看,但它们保留了正确的行数。

我像这样向我的类添加属性:

class Gerbil {
    mixin property!("id", int);
    mixin property!("x", float);
    mixin property!("y", float, 11.0);  // give this one a default value
}

如果需要,您可以向 propertySetter 模板添加一些代码,通知某种监视器它已更改(传递 ID、属性名称和新值)。然后监视器可以将此信息传输到服务器端的相应监视器,服务器端将找到具有正确 ID 的对象并将指定的属性设置为新值。

关于reflection - 在 D 中透明地同步对象中的任意属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3831498/

相关文章:

c# - 没有 Getter/Setter 的反射?

windows - 在 Windows 和 OSX 之间自动同步剪贴板

c++ - std::set 的运算符重载无法正常工作

围绕 2 个字符串流 ("dialogue"模仿的 C++ 包装器)

reflection - MEF:加载具有不同属性的部件(插件)

C# 泛型 如何获取作为参数传递给没有对象类型作为参数的泛型方法的类型?

c# - 检查 C# 中的任何 int 类型?

android - 从 Android 内容提供商到我的远程服务器的数据同步

c - 没有锁的一插入多读列表安全吗?

c++ - 可以用 C++ 制作 "future-safe"比较运算符吗?