gpt4 book ai didi

c# - 用临时属性覆盖对象属性?

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:16 26 4
gpt4 key购买 nike

我无法弄清楚如何构建它。

我有一个 VehicleState 类,其属性包括 passengers:

public class VehicleState
{
public int _temp_passengers;
public int _passengers;
public int passengers
{
set { _temp_passengers = value; }
get { return _passengers; }
}
public void CommitState()
{
_passengers = _temp_passengers;
}
}

有一个循环每 X 秒触发一次。在模拟中,每辆车都会影响另一辆车。

为了避免在每辆车影响其他车辆时破坏属性,我将它们存储在一个临时字段中,例如_乘客。临时值在循环结束时提交给常规值。


问题如下:

passengers = passengers - 1;
passengers += 1

变成:

_temp_passengers = _passengers - 1;

编辑:

为了进一步解释这个问题,假设有 10 辆车影响 A 车,乘客增加 1。每位乘客都离开他们的车去登上 A 车。

因此操作 passengers += 1 将被调用 10 次,但操作就像只调用了一次一样!


  • 有没有设计模式可以解决这个问题?

  • 我可以像这样将每个属性包装在一个类中吗?

  • 我可以在 set{} 中添加 +=-= 条件吗?

有什么想法吗?谢谢! :)

最佳答案

只需使用一种延迟执行

public class VehicleState
{
List<Action> actionList = new List<Action>();

public int passengers { get; set; }

public void CommitState()
{
foreach (var action in actionList)
{
action();
}
}

public void Execute(Action action)
{
actionList.Add(action);
}
}

测试

    [TestMethod]
public void MyTestMethod()
{
var vs = new VehicleState { passengers = 3 };
vs.Execute(() => vs.passengers += 1);
Assert.AreEqual(3, vs.passengers);
vs.CommitState();
Assert.AreEqual(4, vs.passengers);

}

此解决方案的局限性

此解决方案仅提供延迟执行。根据您的情况,这可能有用也可能没用。

var vs1 = new VehicleState { passengers = 3 };
var vs2 = new VehicleState { passengers = 3 };

vs1.Execute(() => vs1.passengers += vs2.passengers);
// vs2.Execute(() => vs2.passengers -= vs1.passengers); // does not work

// remember state before
var beforeVs1passengers = vs1.passengers;
vs2.Execute(() => vs2.passengers -= beforeVs1passengers); // that works

vs1.CommitState(); // order might be important, no common state, no stack
vs2.CommitState();
Assert.AreEqual(6, vs1.passengers);
Assert.AreEqual(0, vs2.passengers);

关于c# - 用临时属性覆盖对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17926346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com