尽量不要太在意我在这里做的事情,这只是一个例子:
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
。
有没有办法在不添加setter的情况下执行此操作?这需要我在我的AndTerm
上创建一个公共无参数构造函数,然后添加一个Set
方法,它不是很漂亮,并允许你构造无效的对象。
或者是否有一些神奇的方法可以重新分配dict
以指向新对象并更新所有现有引用?显然我不允许重载=
运算符。
想出一个解决方案。我添加了一个名为ProxyTerm
的额外术语:
var dict = new ProxyTerm();
var value = key | dict;
...
dict.Term = "{" + set + "}";
这允许我将基类Term
类保持为抽象,然后我不需要公开任何私有变量或添加任何setter。
答案 0 :(得分:1)
解决方案是针对接口或抽象基础进行编码并使用代理模式。
class ProxyTerm : ITerm {
ITerm Reference { get; set; }
ITerm.SomeMethod() {
Reference.SomeMethod();
}
}
这样你就可以在之后插入真实的参考资料。