2

我有以下代码:

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 类)还是有更好的解决方案?

4

3 回答 3

2

如果您使 A 成为 C 中的嵌套类,它应该可以工作。

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();
        }
    }
}
于 2012-05-15T10:57:40.793 回答
0

从 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();
    }
}
于 2012-05-15T10:51:36.897 回答
0

建议的方法从 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();
    }
}
于 2019-10-01T11:11:25.193 回答