类嵌套和访问修饰符
本文关键字:访问 嵌套 | 更新日期: 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();
}
}