我有一个
Object
类,允许将对象链接在一起。
A -> B -> C(单向链接)
当通过调用
Link(IObject other)
在两个对象之间形成链接时,我想在 IsReferenced
对象上设置 Next
。
因此,在上面的示例中,A 引用了 B,但 B 并未引用 A,B 只是将其
IsReferenced
属性设置为 true。
但是,我只希望实现
IsReferenced
接口的类可以使用 IObject
setter。即 IsReferenced
只能在 Object
类内部设置,外部代码不应该能够设置它。
但是,通过接口访问时,代码无法编译,因为
IsReferenced
是只读的。
public interface IObject
{
bool IsReferenced { get; }
IObject? Next { get; }
void Link(IObject next);
}
public class Object : IObject
{
public bool IsReferenced { get; }
public IObject? Next { get; private set; }
public void Link(IObject next)
{
Next = next;
next.IsReferenced = true;
}
}
我可以通过执行以下操作来解决该问题:
public void Link(IObject next)
{
Next = next;
((Object)next).IsReferenced = true;
}
但这不适用于我的场景,因为我需要能够
Mock<IObject>
除了将
IsReferenced
设为公共 setter 之外,还有更好的解决方案吗?
目前您没有引用该属性,甚至没有引用“单向链接”。为什么不这样做,这样可以为您提供对象是否链接的信息以及 2 向链接:
public interface IReferenceableObject
{
IReferenceableObject? ReferencingObject { get; }
IReferenceableObject? ReferencedBy { get; }
void SetLink(IReferenceableObject other);
}
public class Object : IReferenceableObject
{
public IReferenceableObject? ReferencingObject { get; private set; }
public IReferenceableObject? ReferencedBy { get; private set; }
public void SetLink(IReferenceableObject refObject)
{
ReferencingObject = refObject;
refObject.SetLink(this);
}
}