类嵌套和访问修饰符

本文关键字:访问 嵌套 | 更新日期: 2023-09-27 18:34:16

>我有以下一段代码:

class A
{
    public C GetC()
    {
        return new C();
    }
}
class B
{
    //has access to A but can not create C. Must ask A to create C.
    private void method()
    {
        A a = new A();
        C c = a.GetC();//Ok!
        C c2 = new C();//Not allowed.
    }
}
class C
{
}

在 C 上应该使用哪些访问修饰符,以便只能通过 A 访问?(只有A类知道如何正确初始化C类)还是有更好的解决方案?

类嵌套和访问修饰符

如果你在 C 中将 A 作为嵌套类,它应该可以工作。

public class B
{
    //has access to A but can not create C. Must ask A to create C.
    private void method()
    {
        var a = new C.A();
        var c = a.GetC();//Ok!
        var c2 = new C();//Not allowed.
    }
}
public class C
{
    private C()
    {
    }
    public class A
    {
        public C GetC()
        {
            return new C();
        }
    }
}
从 C

继承 A,并使 C 的构造函数受到保护
编辑 -- "由于无法通过限定符访问受保护成员",错误即将到来,作为解决方法,引入了静态成员,它将返回实例。此受保护成员可从派生访问。

class A : C
{
    private C GetC()
    {
        C c = C.GetC();
        return c;
    }
}
class C
{
    protected C()
    {
    }
    protected static C GetC()
    {
        return new C();
    }
}

建议的方法从 C 继承 A,并使 C 受保护的代码的构造函数不起作用,因为其中有一些错误。调整后此方法代码如下:

class B
{
    static void Main(string[] args)
    {
        A a = new A();
        C c = a.GetC();
        C c2 = C(); //Non-invocable member 'C' cannot be used like a method
    }
}
class A : C
{
    public new C GetC()
    {
        C c = C.GetC();
        return c;
    }
}
class C
{
    protected C()
    {
    }
    protected static C GetC()
    {
        return new C();
    }
}