类嵌套和访问修饰符

时间:2012-05-15 10:42:26

标签: c# class nested

我有以下代码:

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类) 或者有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

如果你在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();
        }
    }
}

答案 1 :(得分: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();
    }
}

答案 2 :(得分: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();
    }
}