封装属性的接口实现

问题描述 投票:0回答:1

我有一个

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 之外,还有更好的解决方案吗?

c# inheritance interface properties encapsulation
1个回答
0
投票

目前您没有引用该属性,甚至没有引用“单向链接”。为什么不这样做,这样可以为您提供对象是否链接的信息以及 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.