【问题标题】:accessibility propagation of nested types/type members嵌套类型/类型成员的可访问性传播
【发布时间】:2017-09-20 00:56:25
【问题描述】:

在我的理解中,如果我们在T1内部有一些类型T1和一个嵌套类型T2(或一个成员M2),那么T2M2)的可访问性是最小的T1T2 的可访问性。

我的意思是通过在以下架构中搜索两个可访问性级别并采用较低的一个来获得的可访问性:

public
|
protected internal
|            |
internal     protected
       |     |
 (protected AND internal)*
             |
             private

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

例子:

internal class T1
// internal
{
    public int i;
    // internal

    protected class T2
    // protected and internal
    {
        public int j;
        // protected and internal
    }
}

正确吗?如果不是,此规则有哪些例外情况?

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

要记住的是,封闭的访问修饰符 始终考虑类型。比如里面的一个公共方法 内部类具有内部的可访问性。 有 例外情况(例如,当一个内部类实现一个 公共接口或当一个类覆盖的公共虚拟成员时 一个基类),所以你需要在 确定您需要的类型的可访问性。

但没有进一步解释这意味着什么,我不明白。

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

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

【问题讨论】:

    标签: c# access-modifiers


    【解决方案1】:

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

    这里是设置:一个嵌套的私有类实现一个公共接口。

    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();
        }
    }
    

    该类的用户通过将HiddenCallMe() 方法强制转换为公共接口IVisible 来获得对CallMe() 方法的访问权限:

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

    如果孩子不是,如何更容易访问被覆盖的方法?

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

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

    【讨论】:

    • 除了将对象强制转换为基本类型或接口的规则之外,还有其他例外吗?
    • @Kjara 同样适用于构造公共委托的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多