c# - 用 protected 覆盖​​ protected 内部!

标签 c# virtual-functions

这是 question扩展一个小时前问过。

当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control

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

任何人都可以解释一下吗?谢谢

最佳答案

We cannot modify the access modifiers when overriding a virtual method in derived class.

这个说法是错误的。在您描述的情况下,您可以并且必须更改访问修饰符。在其他情况下,您不得更改访问修饰符。

请参阅规范的第 10.6.4 节,其中指出:

an override declaration cannot change the accessibility of the virtual method. However, if the overridden base method is protected internal and it is declared in a different assembly than the assembly containing the override method then the override method’s declared accessibility must be protected.

推理很简单。

Asad,你有一个银行账户 BankAccount。

你有一个房子。你在豪斯租了一个房间给你最好的 friend 查理。

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

您有一个儿子 Elroy,住在公寓里。

Elroy 有一个儿子,也就是您的孙子 Frank,他住在蒙古包里。

Elroy 有一个最好的 friend Greg,他和他一起住在公寓里。

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

David 无法访问,因为他既不是您,也不是您的后代,也不住在 House 中。他是你室友的 child 无关紧要;他无法访问您的银行帐户。

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

现在我们来到了问题的关键。 不允许 Elroy 将您的 BankAccount 的访问权限扩展到 Greg。您拥有该 BankAccount,并且您说“我自己、我的后代和我的室友”。您的 child 无权将 BankAccount 的可访问性扩展到您最初设置的范围之外。

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

明确一点:

  • 我和我的后代获得访问权限 = protected 访问权限
  • 我和我的室友获得访问权限 = 内部访问权限
  • 我和我的后代以及我的室友获得访问权限 = protected 内部访问权限
  • 控制=阿萨德
  • CreateChildControls = BankAccount
  • House = System.Web.DLL
  • Charlie = System.Web.DLL 中的任何类型
  • David = 程序集 Apartment.DLL 中 Charlie 的派生类型
  • Elroy = someClass
  • Condo = 包含 SomeClass 的程序集
  • Greg = Condo.DLL 中的其他一些类
  • Frank = Yurt.DLL 中 someClass 的派生类型
  • 蒙古包 = 一些其他集会

关于c# - 用 protected 覆盖​​ protected 内部!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375792/

相关文章:

c# - 尝试创建 ASP.NET MVC 4 Controller 时出现 FileNotFound 异常

c# - IDistributedCache 可用但数据不再在缓存中?

c# - QueryObject 包含 Entity Framework

android - 基类成员函数直接访问子类成员函数?

c++ - 这是虚拟成员函数模板吗?

c# - 在方法覆盖中更改 params 修饰符

c# - 直接在javascript函数中调用C#方法

c++ - 类 vtable 如何跨共享库工作?

c++ - 使用虚拟方法纠正行为

c# - 反序列化嵌套和非结构化 BsonDocument(mongodb c# 驱动程序)