如何执行引用分配

本文关键字:引用 分配 执行 何执行 | 更新日期: 2023-09-27 18:27:54

尽量不要太在意我在这里做的事情,这只是一个例子:

var @string = new RegexTerm("...");
var literal = new RegexTerm("...");
var key = @string | literal;
var dict = new Term();
var value = key | dict;
var kvp = key | value;
var item = key | kvp;
var set = item + !("," + item);
dict = "{" + set + "}";

我有一种循环关系。value需要定义dict,而dict需要定义value

所以我所做的是将dict初始化为某个占位符Term,这样我就可以在下面的赋值中使用它,然后我稍后会给出它的实际值

问题是现在value不再引用最后一行中定义的同一对象。我本质上想在不创建新对象的情况下重新分配dict

有没有办法做到这一点而不添加二传手?这将需要我在AndTerm上创建一个公共的无参数构造函数,然后添加一个Set方法,这就不那么漂亮了,并且允许您构造无效对象。

或者有什么神奇的方法可以重新分配dict指向一个新对象并更新所有现有的引用?显然,我不允许=运算符过载。


想出了一个解决方案。我添加了一个额外的术语,称为ProxyTerm:

var dict = new ProxyTerm();
var value = key | dict;
...
dict.Term = "{" + set + "}";

这使我可以将基本Term类保持为抽象类,这样我就不需要公开任何私有变量或添加任何setter。

如何执行引用分配

解决方案是针对接口或抽象库进行编码,并使用代理模式。

class ProxyTerm : ITerm {
     ITerm Reference { get; set; }
     ITerm.SomeMethod() {
          Reference.SomeMethod();
     }
}

这样你以后就可以插入真正的参考了。