x个类只能相互访问吗?

时间:2015-10-01 13:42:54

标签: c# .net

鉴于可用的accessibility Levels,是否有任何模式或适当的方法使类A只能从类B和C访问,反之亦然,其中类A,类B和类C之间没有继承关系? (最好在编译时)

A,B和C是兄弟姐妹,位于同一名称空间中。

到目前为止,唯一想到的是:

  • 使用反射来确定调用类并抛出异常(运行时)
  • 嵌套类(使用基类)并使用protected修饰符

后者似乎是最好的方法,但还有其他方法吗?我正在寻找类似InternalsVisibleTo但在装配体内的东西。

2 个答案:

答案 0 :(得分:2)

可以创建一个包含三个类作为私有嵌套类的包含类:

public class O
{
    private class A { private void Test() {B b = new B(); C c = new C(); }}
    private class B { private void Test() {A a = new A(); C c = new C(); }}
    private class C { private void Test() {B b = new B(); A a = new A(); }}
}

public class Hacker
{
    O.A a = new O.A();  // fail
}

请注意,嵌套类并不意味着任何类型的继承关系 - 它纯粹用于访问目的。

但如果他们不能在他们的小圈子之外进入,那三个班级的重点是什么? 做什么使用这些类?

答案 1 :(得分:1)

你可以得到的最严格的(虽然仍能从其他课程中看到它)是internal,但是如你所知,那个集合中的任何类都可以看到该类。

在Java中使用包私有类似的东西会很好,除了该包的其他成员(命名空间)之外它是私有的,但是唉C#没有。

但是,您可以安排程序集强制执行此操作:

而不是:

Assembly
   -internal A
   -B (uses A)
   -C (uses A)
   -D (uses the public classes of Assembly1, but can also see A)

将它们分开:

Assembly1
   -internal A
   -B (uses A)
   -C (uses A)
Assembly2
   -references Assembly1
   -D (uses the public classes of Assembly1, can't see A)

您不能拥有循环引用,因此与它们共享程序集不同,这会强制执行从Assembly2到Assembly1的依赖关系的方向。

相关:I'd like a warning about circular namespace dependency