2012-05-15 30 views
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类知道如何正确初始化C类) 还是有更好的解决方案吗?的C

+1

也许使C类的嵌套类具有私有构造函数。 –

+1

我试过了,它不会工作,因为C构造函数是私有的。 – SuperUser

+0

A,B和C在同一个程序集中? – Magnus

回答

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(); 
     } 
    } 
} 
+0

中的解决方法感谢队友! :) – SuperUser

+0

@ user1043127很高兴能帮到您 – Magnus

+0

优雅的解决方案! –

0

继承自C,并构造保护
编辑 - “为保护成员无法通过预选赛访问”错误快到了,作为一个替代,静态成员介绍了将返回实例。这个受保护的成员可以从派生的。

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

class C 
{ 
    protected C() 
    { 
    } 
    protected static C GetC() 
    { 
     return new C(); 
    } 
} 
+0

无法通过'TestNamespace.C'类型的限定符访问受保护成员'TestNamespace.C.C()';限定符必须是“TestNamespace.A”类型(或从中派生) – SuperUser

+0

更新了代码 – Tilak