鉴于可用的accessibility Levels,是否有任何模式或适当的方法使类A只能从类B和C访问,反之亦然,其中类A,类B和类C之间没有继承关系? (最好在编译时)
A,B和C是兄弟姐妹,位于同一名称空间中。
到目前为止,唯一想到的是:
protected
修饰符后者似乎是最好的方法,但还有其他方法吗?我正在寻找类似InternalsVisibleTo
但在装配体内的东西。
答案 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的依赖关系的方向。