如何在没有类嵌套的情况下使一个类只能被其他一个类访问?

时间:2014-07-24 19:04:04

标签: c#

我已经给出了以下代码示例:

public static class A
{
    private static B _b;

    public static B GetB
    {
        get
        {
            if(_b == null)
            {
                _b = B.load();
            }
            return _b;
        }

    }

    public static void Save()
    {
        if(_b == null)
        {
            _b = B.load();
        }
        _b.Save()
    }
}

public class B
{
    public string Value{ get; set;}

    public void Save()
    {
        //value is being save to somewhere
    }

    public static B load()
    {
        B b = new B();

        // .....
        //b.Value is loaded from somewhere
        // ......
        return b;
    }
}

接下来是我需要解决的问题:

A.GetB.Value = "value";  // OK
B.Load().Value = "value";  // I need to prevent this

以上两行代码完全相同,但......

B.Load()。值应该无法从任何其他地方访问,但A类除外

如果有人有想法,请告诉我......

谢谢,

Fivee

2 个答案:

答案 0 :(得分:3)

基本上你要做的就是不要在A类中嵌套B类,并且A类仍然拥有对Bs字段的独占访问权。如果A和B是独立的类,则这是针对封装的。

您正在寻找friend classes。 C ++中允许使用这些类型的类。 C#不支持朋友类,我们对朋友类最接近的是朋友集。请参阅此post

因此,如果你真的想要这个功能,你需要像其他人建议的那样嵌套它们。

此外,如果您最终执行嵌套类解决方案。 Here是一种绝对漂亮的方式,只处理嵌套类的私有成员对其容器类的访问。这有点hacky但仍然......

答案 1 :(得分:2)

我认为另一种解决方案可能是让B成为public类(因为它已经存在),并使B.Load成为internal方法。但是,这只有在您从另一个程序集中调用A.GetB时才会起作用(并且只计划 )。