嵌套类型/类型成员的可访问性传播

时间:2017-04-23 09:39:30

标签: c# access-modifiers

根据我的理解,如果我们在DataSource中有一些类型T1和嵌套类型T2(或成员M2),则{{1}的可访问性} {({1}})是T1T2的最低可访问性。

至少我指的是通过搜索以下架构中的两个辅助功能级别并获取较低级别的辅助功能级别来获得的可访问性:

M2

(*这不是由访问修饰符直接定义的。它只允许从程序集内定义的继承类型进行访问。)

示例:

T1

这是正确的吗?如果没有,这条规则有什么例外?

我问,因为在Wouter de Kort写的“C#编程:考试参考70-483”一书中写道:

  

要记住的是封闭的访问修饰符   类型总是被考虑在内。例如,里面的公共方法   内部类具有内部可访问性。 有   对此的例外(例如,当内部类实现一个   公共接口或当类重写公共虚拟成员时   一个基类),所以你需要跟踪那些事情   确定您需要的类型的可访问性。

但是没有进一步解释这意味着什么,我也没有得到它。

  1. 如果内部类实现了公共接口,则此类只能在程序集中使用。那么实现的接口方法如何比内部更容易访问?它与静态方法有关吗?

  2. 如果子类重写基类的公共方法,则只能在指定的级别访问子级。那么,如果孩子不是,那么如何更容易理解被覆盖的方法呢?它与静态方法有关吗?

1 个答案:

答案 0 :(得分:2)

  

实现的接口方法如何比内部更容易访问?

以下是设置:嵌套的私有类实现了一个公共接口。

public interface IVisible {
    void CallMe();
}

public class Outer {
    private class Hidden : IVisible {
        public void CallMe() {
            Console.WriteLine("I'm hidden!");
        }
    }
    public static IVisible GetObject() {
        return new Hidden();
    }
}

此类用户可以通过将其转换为公共接口CallMe()来获取Hidden IVisible方法的访问权限:

IVisible obj = Outer.GetObject();
obj.CallMe(); // prints "I'm hidden!"
  

如果孩子不是,那么如何更容易理解被覆盖的方法?

相同的设置适用:您创建一个可访问的方法,该方法返回一个不可访问类型的实例(Hidden)作为其公共基类或其公共接口的对象(即假设IVisible是一个类,而不是接口)。

基本上,公共接口(例如IVisible)为非公开实现提供了一个“窗口”(例如Hidden)。这是一种非常强大的技术,用于控制对您希望公开的行为的访问。