2008-10-20 108 views
0

我想要一个类的方法:“One”(“AccessibleWithinSameNamespace”)可以通过类访问:“Two”,而不是“Two”扩展“One”。类成员访问修饰符

这两个类都在同一个命名空间中,所以我想可能有一个访问修饰符模仿“保护”修饰符,但是对于命名空间。

一些代码:

namespace Test 
{ 
    class One 
    { 
     public void AccessibleToAll() 
     { 
     } 


     protected void AccessibleWithinSameNamespace() 
     { 
      // I am not public 

      // I can be accessed from other classes 
      // within the same namespace of my class 
     } 
    } 
} 

namespace Test 
{ 
    class Two 
    { 
     public Two() 
     { 
      One one = new One(); 

      // I am able to access this method because my class 
      // is in the same namespace as the class: "One" 
      one.AccessibleWithinSameNamespace(); 
     } 
    } 
} 

回答

4

可以使用internal修饰符如果两个类都在同一个组件。

你的榜样:

namespace Test 
{ 
    class One 
    { 
     public void AccessibleToAll() 
     { 
     } 


     internal void AccessibleWithinSameNamespace() 
     { 
      // I am not public 

      // I can be accessed from other classes 
      // within the same namespace of my class 
     } 
    } 
} 

namespace Test 
{ 
    class Two 
    { 
     public Two() 
     { 
      One one = new One(); 

      // I am able to access this method because my class 
      // is in the same namespace as the class: "One" 
      one.AccessibleWithinSameNamespace(); 
     } 
    } 
} 
+0

感谢。我会试试看。 – roosteronacid 2008-10-20 21:18:13

1

C#和.NET有 “同一个命名空间内” 没有概念。内部是最接近的等值。

1

的问题是不是为命名其功能的访问修饰符访问修饰符。 “受保护”意味着它可以由子类访问,而不是由其他类访问,即使它们位于相同的命名空间中。

您有几种解决方案可供选择...... 1.您可以为函数“internal”设置访问修饰符,然后为同一个程序集内的所有类/函数设置访问修饰符(或者标记一些很酷的组件标志以便它们假装在同一个程序集中)可以访问它 2.使“TWO”成为“One”的一个子类,然后两个可以调用它(但不是通过“One”的实例,如相同代码所示)

1

由于命名空间是任意的 - 他们不能真正成为一个安全边界任何人都可以创建一个可重用的命名空间测试组件

你能做的最好的是限制使用的一个组件。已经提到过内部(如果需要,还有InternalsVisibleTo)。

编辑:InternalsVisibleTo允许其他程序集访问internal方法和类,就好像它们在同一个程序集中一样。你可以强有力地命名其他程序集,这提供了安全性。这通常用于测试程序集以测试主程序集的内部成员,而不会通过包含测试代码来扩大主程序集。

注意的是,VB.NET编译器不尊重InternalsVisibleTo - 所以VB组件不能打电话到InternalsVisibleTo归因组装。但是,C#可以调用具有适当的InternalsVisibleTo属性的VB.NET程序集。

+0

你能解释一下“InternalsVisibleTo”的事情吗? – roosteronacid 2008-10-20 21:18:56