内部接口&;课程

本文关键字:课程 amp 接口 内部 | 更新日期: 2023-09-27 18:14:37

我正在重构一些我没有写的代码,其中包含我不想公开的业务逻辑和专有算法。所有代码当前都标记为内部代码;出于测试目的,为了确保我不会破坏现有的客户端/服务,我想将它们切换到使用接口,并实现这些接口。

我已经将我的类标记为内部,将它们的成员标记为受保护的内部,将我的接口标记为内部。但要使用内部接口,我必须公开我的几个属性。

我相信,通过一些有限的测试,似乎已经证明了只有友元程序集和程序集中的类才能使用这些内部接口和类。

只要类和接口都是内部的,即使某些方法和属性被标记为public,它们还会公开吗?

看起来不是这样,但我正在寻找我可能错过的任何东西。

内部接口&;课程

如果您的意思是使用程序集中的protected as不能直接使用它们,那么是的,如果interfaceclass标记为internal,那么它们在程序集外部将不可见。可以将接口和成员上的访问级别看作是要通过的独立锁。

如果您可以在interface的访问级别看到它,那么您可以存储对它的引用,然后如果您可以看到其访问级别的属性/方法,那么您就可以调用/set/get它们。

不过,请记住,正如@phoog所指出的,protected internalinternal宽松一些。

也就是说,如果internal类实现了public接口,并且这些属性也是public接口的一部分,那么它们可能是可见的。。。但这真的越来越模糊了。。。

public interface IVisible
{
    string VisibleProperty { get; set; }
}
internal class InvisibleClass : IVisible
{
    public string VisibleProperty { get; set; }
}

在上文中,如果可以找到构造或接收对类InvisibleClass的引用的方法(例如,如果它是从原始程序集中的工厂方法返回的(,则可以通过不同程序集中的IVisible引用来引用该类。

抛开这些不谈,如果你的问题是你想避免它们通过反编译器、反射等进行检查,那就是一个不同的问题。。。

公共成员只能与其类型一样可访问("通常,成员的可访问性不大于包含它的类型的可访问度。但是,如果成员实现接口方法或重写公共基类中定义的虚拟方法,则内部类的公共成员可能可以从程序集外部访问。"(。

不过,不要被protected internal问题所困扰:protected internal成员可用于程序集之外的派生类。

参考文献:

可访问性级别:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx

访问修饰符:http://msdn.microsoft.com/en-us/library/ms173121.aspx

你说得对。由于不能从外部访问内部类(除了友元程序集(,因此也不能访问它的任何方法,即使它们是公共的。

可以从外部访问内部类,该类具有公共基类或实现公共接口。但是,您只能访问该类中既在基类(或接口(中又在子类中重写的公共方法(因此该方法也应该是virtual或接口的一部分,这也使其成为virtual(。为此,您必须获得由超类(或接口(变量引用的类的实例。