用 protected 覆盖受保护的内部!

2024-03-24

这是一extension为了这question https://stackoverflow.com/questions/2375556/overriding-and-overridden-methods-must-have-same-accessibility-so-why-isnt-same/2375590#2375590一小时前问的。

我们无法修改access modifiers,当覆盖virtual method in derived班级。考虑Control上课于System.Web.UI名称空间

public class Control : IComponent, IDisposable,...
{ 
   protected internal virtual void CreateChildControls()
   { }
   .
   .
}

现在考虑一下

public class someClass : System.Web.UI.Control
    { 
       // This should not compile but it does
        protected override void CreateChildControls()
        { }

       // This should compile but it does not
        protected internal override void CreateChildControls()
        { }  
    }

有谁能解释一下吗?谢谢


当重写派生类中的虚拟方法时,我们无法修改访问修饰符。

这种说法是错误的。你可以和must在您所描述的情况下更改访问修饰符。在其他情况下,您不得更改访问修饰符。

我建议您参阅规范的第 10.6.4 节,其中规定:

覆盖声明不能更改 虚拟的可访问性 方法。但是,如果被覆盖 基本方法受内部保护并且 它是在不同的程序集中声明的 比包含的程序集 覆盖方法然后覆盖 方法声明的可访问性必须 受到保护。

推理很简单。

你,阿萨德,有一个银行账户,BankAccount。

你有一个房子。您在 House 租了一个房间给您最好的朋友查理。

查理有一个儿子大卫,住在一套公寓里。

你有一个儿子,埃尔罗伊,住在公寓里。

埃尔罗伊有一个儿子,也就是你的孙子弗兰克,他住在蒙古包里。

埃尔罗伊有一个最好的朋友格雷格,和他一起住在公寓里。

您授予您自己、居住在 House 中的任何人以及您的任何后代访问您的银行账户的权限。因此,可以访问银行帐户的人是 Asad、Charlie、Elroy 和 Frank。

大卫无法进入,因为他既不是您,也不是您的后裔,也不住在众议院。他是你室友的孩子并不重要;他是你室友的孩子并不重要。他无法访问您的银行帐户。

格雷格也无法访问您的银行帐户。他不是你的后裔。他不住在House。他与您的后代住在一起这一事实并不赋予他与您的后代相同的权利。

现在我们来到了问题的关键。埃尔罗伊 (Elroy) 不得将您的银行帐户的访问权限授予格雷格 (Greg)。你拥有那个银行账户,你说“我自己、我的后代和我的室友”。您的孩子无权将 BankAccount 的可访问性扩展到您最初设置之外。

当 Elroy 描述他对 BankAccount 的访问权限时,他只能说“我向我自己和我的后代授予对此的访问权限”,因为这是您已经允许的。他不能说“我向我自己、我的后代和 Condo 的其他居民授予对 BankAccount 的访问权限”。

需要明确的是:

  • 我和我的后代获得访问权限 = 受保护的访问权限
  • 我和我的室友获得访问权限 = 内部访问权限
  • 我和我的后代以及我的室友获得访问权限 = 受保护的内部访问权限
  • 控制=阿萨德
  • CreateChild 控件 = 银行帐户
  • House = System.Web.DLL
  • Charlie = System.Web.DLL 中的任何类型
  • David = 程序集 Apartment.DLL 中 Charlie 的派生类型
  • 埃尔罗伊 = someClass
  • Condo = 包含 SomeClass 的程序集
  • Greg = Condo.DLL 中的其他一些类
  • Frank = Yurt.DLL 中 someClass 的派生类型
  • 蒙古包=其他一些组件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 protected 覆盖受保护的内部! 的相关文章

  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 选择initializer_list迭代器定义

    Why std initializer list
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 什么是 intptr?

    我不明白 IntPtr 是什么 有人可以解释一下吗 谢谢 它是一个与指针大小相同的整数 32 位图像中为 32 位宽 64 位图像中为 64 位宽
  • speedtest-cli 在控制台中工作,但不能作为脚本工作

    我正在尝试使用 speedtest cli api 从官方wiki复制了部分代码 并删除了未使用的内容 import speedtest s speedtest Speedtest s get best server s download
  • Swagger/Swashbuckle 文档生成仅适用于 MVC 核心应用程序中的 API 控制器

    我们有一个带有常规 MVC 控制器的 ASP NET MVC Core 应用程序 此外 我们在 Controllers 文件夹中还有一个名为 API 的子文件夹 其中包含少量 API 控制器 我们正在使用 IncludeXmlComment
  • EXC_BAD_ACCESS 在带有参数的本地化字符串上崩溃

    这里遇到了一个只出现在某些手机上的奇怪问题 我有一个自定义的 UIView 我像这样初始化 let passQuizToTutorAlert SAAlertView title NSLocalizedString quiz title co
  • Laravel 符号链接和 cPanel

    在我的 Laravel 网站上 我使用符号链接来存储和显示存储中的图像 With php artisan storage link 我创建了符号链接 每次上传新新闻文章时 图像都会上传到主存储中 并使用符号链接将其设置到公共文件夹中 并且我
  • 如何将 WAMP 本地主机从 Firefox 移至 chrome?

    我最近在计算机上安装了 WAMP 服务器 当我打开 localhost 时 它会自动在 Firefox 中打开 我希望它在 Chrome 中打开 以便我可以使用 Chrome 开发人员工具 如何让我的本地主机在 chrome 而不是 fir
  • JavaScript if 语句的行为不符合预期

    刚刚学习 JavaScript 代码 尝试学习 if 语句 但我的代码不起作用 var car 8 if car 9 document write your code is not working 这会执行写入命令 我不知道为什么 我使用制
  • 如何在水平回收器视图上滑动仅将下一个项目带入视图 - Android

    我有一个水平的RecyclerView显示 4cards编号为1 4 这些卡片占据了屏幕的整个宽度 因此一次只能完全看到一张卡片 用户会看到第一张卡 当他们像这样向左滑动卡时 the RecyclerView将一直滚动到数字 4 我不想那样
  • 无法在 C++ 应用程序中导入 dll

    我有一个名为hecom32 dll 我想在我的应用程序中使用它 我确认以下内容 import hecom32 dll 我收到以下错误 enter Error 1 error C1083 Cannot open type library fi
  • 对于动态、个性化的 Web 应用程序来说,多长的响应时间才被认为是良好的响应时间? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • randomBytes 与伪RandomBytes

    在什么情况下 从安全角度来看 使用节点的crypto pseudoRandomBytes http nodejs org api crypto html crypto crypto pseudorandombytes size callba
  • 如何防止 Xcode 7 Playgrounds 自动运行?

    我正在开发一个 Xcode 7 Playground 它可以同时运行很多东西 每当我进行编辑时 它都会刷新 重新启动正在运行的内容并再次运行整个代码 大约每 15 分钟就会让我的游乐场崩溃 有没有办法阻止游乐场在我进行编辑时自动运行 在游乐
  • 使用seaborn绘制系列

    category df category name column value counts 我有上面的系列返回值 CategoryA 100 CategoryB 200 我试图在 X 轴上绘制前 5 个类别名称 在 y 轴上绘制值 head
  • 在 AngularJS 中递归访问父指令的控制器

    我需要获取父级的控制器 因此我的指令有一个 require 属性 如下所示 module directive tag function return require tag restrict E controller function th
  • MySQL Grant 用于多个数据库

    我试图同时设置两个数据库的权限 我知道可以在两个语句中分配它们 有没有办法一劳永逸地做到这一点 I tried GRANT ALL PRIVILEGES ON mydb1 mydb2 TO reader localhost IDENTIFI
  • open_uri / Nokogiri 重定向问题

    我正在使用 Nokogiri 来抓取一个可以正常工作的网页 除非该页面有重定向循环 所以当我抓取这个网站时 https www cardcomplete com besuchen isie uns auf facebook https ww
  • MonoTouch 和 Xcode 4

    既然 Xcode 4 GM 种子已经发布 MonoDevelop 最终会以某种方式与其交互以进行 XIB 编辑吗 我目前正在将每个 XIB 上的 打开方式 手动设置为旧的 Interface Builder 但是这样做有两个问题 我必须记住
  • 这个 JavaScript/jQuery 语法是什么意思?

    下面的语法是什么意思 function fn columnize function options What s function What s fn 在编写插件时使用此约定 以确保使用 符号与其他 Javascript 库不发生冲突 同时
  • 如何获取表格单元格中的标签以继续到下一行而不是被切断屏幕? (Xcode 8)

    所以基本上我将文本从数组加载到表视图中的单元格中 但不是像我想要的那样继续到下一行 而是输入的文本标签在单个单元格中从屏幕上被截断 我在网上查了一下 据说将 numberOfLines 设置为 0 将 lineBreakMode 设置为 N
  • 用 protected 覆盖受保护的内部!

    这是一extension为了这question https stackoverflow com questions 2375556 overriding and overridden methods must have same acces