令人费解的架构问题:您有两个对称类A
和B
。每个A
/ B
对象可以使用IA
/ IB
方法私下生成A.CreateIA()
/ B.CreateIB()
类型的值。相反的类需要这些值 - A
需要IB
和B
需要IA
。
目标是编写构建互连一对PairMaker.MakePair()
和A
对象的B
函数。您还必须为A
和B
类编写适当的构造函数。 A
和B
类在不同的程序集中,并且看不到彼此的内部。链接应该是安全的 - 外部代码不应该能够访问或修改对象字段。您可以根据需要编写其他类并将任何方法添加到A
和B
- 只是不要破坏链接的安全性。
interface IA { }
interface IB { }
class A {
IB ib;
//Some constructor
//Other members
IA CreateIA() { }
}
class B {
IA ia;
//Some constructor
//Other members
IB CreateIB() { }
}
class PairMaker {
public static Tuple<A, B> MakePair() {
//What's here?
}
}
此问题与How to construct two objects, with each other as a parameter/member类似,但该问题未得到妥善回答。
更新:请注意,此问题 IS 可解决(因为您可以编写所需的任何构造函数)。请不要仅因为您无法设计解决方案而进行投票或关闭此问题。
答案 0 :(得分:0)
这是一个可能的解决方案。我不喜欢它的外观(我讨厌构造函数中的那些out
参数)。
class A {
IB _ib;
public A(out Func<IA> getter, out Action<IB> setter) {
getter = CreateIA;
setter = SetIB;
}
void SetIB(IB ib) {
_ib = ib;
}
IA CreateIA() { throw new NotImplementedException(); }
}
class B {
IA _ia;
public B(out Func<IB> getter, out Action<IA> setter) {
getter = CreateIB;
setter = SetIA;
}
void SetIA(IA ia) {
_ia = ia;
}
IB CreateIB() { throw new NotImplementedException(); }
}
class PairMaker {
public static Tuple<A, B> MakePair() {
Func<IA> iaGetter;
Func<IB> ibGetter;
Action<IA> iaSetter;
Action<IB> ibSetter;
A a = new A(out iaGetter, out ibSetter);
B b = new B(out ibGetter, out iaSetter);
iaSetter(iaGetter());
ibSetter(ibGetter());
return Tuple.Create(a, b);
}
}