Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用protected覆盖protected internal!_C#_Virtual Functions - Fatal编程技术网

C# 用protected覆盖protected internal!

C# 用protected覆盖protected internal!,c#,virtual-functions,C#,Virtual Functions,这是一个小时前询问的分机 当重写派生的类中的虚拟方法时,我们无法修改访问修饰符。考虑控件类> 系统.Web.UI//C>命名空间 public class Control : IComponent, IDisposable,... { protected internal virtual void CreateChildControls() { } . . } 现在考虑这个 public class someClass : System.Web.UI.Control

这是一个小时前询问的
分机

当重写
派生的
类中的
虚拟方法
时,我们无法修改
访问修饰符
。考虑<代码>控件<代码>类> <代码>系统.Web.UI//C>命名空间

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

有人能解释这一点吗?感谢

,因为虽然术语不同,但将其覆盖为受保护
会保持成员的可见性不变。如果允许您将其重写为受保护的内部,则您会突然将该成员暴露给程序集中的任何其他类型。

受保护的内部表示受保护或内部。因此,如果通过在原始程序集外部重写,您被允许将其标记为受保护的内部,那么您将允许与重写器相同的程序集中的其他类调用此方法。这实际上意味着将违反原始父级的内部封装

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

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

请参阅本规范第10.6.4节,其中规定:

重写声明不能更改 虚拟环境的可访问性 方法。但是,如果 基本方法受内部和外部保护 它在另一个程序集中声明 而不是包含 重写方法,然后单击重写 方法声明的可访问性必须 受到保护

理由很简单

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

你有房子。你们把房子里的一个房间租给你们最好的朋友查理

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

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

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

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

你们允许你们自己、住在房子里的任何人以及你们的后代进入你们的银行账户。因此,可以访问银行帐户的人是阿萨德、查理、埃尔罗伊和弗兰克

大卫不能进入,因为他既不是你们,也不是你们的后裔,也不住在家里。他是你室友的孩子是无关紧要的;他无法进入你的银行账户

格雷格也不能进入你的银行账户。他不是你的后裔。他不住在房子里。他与你的后代生活在一起的事实并没有赋予他与你的后代相同的权利

现在我们来谈谈问题的症结所在Elroy不允许将您的银行账户的访问权限扩展到Greg。您拥有该银行账户,并且您说“我自己、我的后代和我的室友”。您的孩子无权将BankAccount的可访问性扩展到您最初设置的范围之外

当Elroy描述他对银行账户的访问权限时,他只被允许说“我授予我自己和我的后代访问权限”,因为这是你们已经允许的。他不能说“我允许自己、我的后代和公寓的其他居民使用银行账户”

我想说清楚:

  • 我和我的后代获得访问权=受保护的访问权
  • 我和我的室友可以进入=内部进入
  • 我和我的后代以及我的室友可以进入=受保护的内部通道
  • 控制=Asad
  • CreateChildControls=BankAccount
  • House=System.Web.DLL
  • Charlie=System.Web.DLL中的任何类型
  • David=程序集单元.DLL中Charlie的派生类型
  • 埃尔罗伊=某个阶级
  • Condo=包含SomeClass的程序集
  • Greg=Condo.DLL中的其他类
  • Frank=Yurt.DLL中someClass的派生类型
  • 蒙古包=其他组件

在这种情况下,当父母的室友试图访问他们认为是父母的银行账户,但实际上是孩子的银行账户时,会发生什么?IE:System.Web.DLL中的某些内容尝试调用控件.CreateChildControls()(通过内部可访问性),但无法访问someClass.CreateChildControls()?很好的类比。。。除了我不会允许住在我房子里的每个人使用我的银行账户;)@埃里克,很有趣的类比。有一个想法——也许将“谁能进入我的银行账户”改为“谁能开我的车”会让这个比喻更能引起人们的共鸣。