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

Fiv*_*rch 5 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

A.GetB.Value = "value";  // OK
B.Load().Value = "value";  // I need to prevent this
Run Code Online (Sandbox Code Playgroud)

上面两行代码做了完全相同的事情,但是......

B.Load().Value应该无法从 A 类以外的任何其他地方访问

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

谢谢,

菲维

Far*_*ori 6

基本上,您想要做的就是不要将 B 类嵌套在 A 类中,并且仍然让 A 类拥有对 B 字段的独占访问权限。如果A和B是独立的类,这是违反封装的。

您正在寻找朋友班。C++ 中允许使用这些类型的类。C# 不支持友元类,而与友元类最接近的是友元程序集。请参阅此帖子

因此,如果您确实想要该功能,则需要按照其他人的建议将它们嵌套起来。

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


Jas*_*zun 1

我认为另一个解决方案可能是创建B一个public类(因为它已经是),并创建B.Load一个internal方法。但是,只有当您从另一个程序集调用时,这才有效(并且A.GetB计划这种情况)。

  • 当 `GetB` 必须是公共的时,您不能将 `class B` 设为私有。 (2认同)