【发布时间】:2019-01-26 18:03:59
【问题描述】:
我正在尝试在 C# 中实现可观察的本机数据类型(float、int、string、List)。我应该补充一点,我是 C# 的新手,并且来自 C++ 背景。
我的第一个想法是有一个像这样的可观察界面:
public interface IObservable {
void registerObserver(IObserver observer);
void deregisterObserver(IObserver observer);
void notifyObservers();
}
然后为本地数据类型(例如浮点数)创建一个包装器,它重载了运算符,因此它(大部分)可以无缝使用:
Float f1 = new Float(0);
Float f2 = f1 + 2;
这必须是一个抽象基类,因为接口不能重载运算符。
然后我想创建一个 ObservableFloat,它结合了这两种想法,但在其状态发生任何变化时都会调用 notifyObservers。使用它的类会将其视为一个 Float,并且不知道它在内部也是一个 Observable。
为此,我通常会重载赋值运算符,而不是这样做:
return new Float(f1.value + f2.value);
它会修改第一个实例并返回它。但是由于赋值似乎总是改变引用,所以我会在第一次赋值操作时丢失我的 observable 及其观察者列表,对吗?
我发现这篇文章使用 C# 中的事件实现了观察者:link 这段代码:
private State _state;
public State MyState
{
get { return _state; }
set
{
if (_state != value)
{
_state = value;
Notify();
}
}
}
基本上是我想要的:当 State 变量被分配一个新值时,它会执行分配并调用一个函数。有什么方法可以在不让 using 类(示例中为 Product)知道变量是 Observable 的情况下实现这一点?
【问题讨论】:
标签: c# events operator-overloading observer-pattern assignment-operator