这是一小时前询问的question extension
。
在覆盖access modifiers
课程中的virtual method
时,我们无法修改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()
{ }
}
任何机构都能解释一下吗?感谢
答案 0 :(得分:47)
在覆盖派生类中的虚方法时,我们无法修改访问修饰符。
该陈述是错误的。在您描述的情况下,您可以必须更改访问修饰符。在其他情况下,您不得更改访问修饰符。
我引用了规范的第10.6.4节,其中指出:
覆盖声明无法更改 虚拟的可访问性 方法。但是,如果被覆盖 基本方法受到内部保护 它在不同的程序集中声明 比包含的组件 覆盖方法然后覆盖 方法声明的可访问性必须 受到保护。
推理很简单。
你,Asad,有一个银行账户,BankAccount。
你有一所房子。你在House租了一间房间给你最好的朋友查理。
查理有一个儿子,大卫,住在公寓里。你有一个住在公寓里的儿子Elroy。
Elroy有一个儿子,你的孙子,弗兰克,住在蒙古包里。Elroy和他住在公寓的最好的朋友Greg。
您可以向自己,居住在众议院的任何人以及任何后代授予访问您的BankAccount的权限。因此,可以访问银行账户的人是Asad,Charlie,Elroy和Frank。
大卫无法进入,因为他既不是你,也不是你的后代,也不是他住在众议院。他是你的室友的孩子是无关紧要的;他无法访问您的BankAccount。Greg也无法访问您的银行帐户。他不是你的后代。他不住在众议院。他与你的后代生活在一起的事实并没有赋予他与你的后代相同的权利。
现在我们来到问题的关键。 Elroy不允许将您的BankAccount扩展到Greg。您拥有BankAccount,并且您说“我自己,我的后代和我的室友”。您的孩子无权将BankAccount的可访问性扩展到您最初设置的范围之外。
当Elroy描述他对BankAccount的访问权限时,他只被允许说“我允许自己和我的后代访问”,因为这是你已经允许的。他不能说“我允许自己,我的后代和公寓的其他居民访问BankAccount”。
要明确:
答案 1 :(得分:6)
因为虽然术语不同,但是将其覆盖为protected
会使成员的可见性保持不变。如果允许您将其覆盖为protected internal
,那么您会突然将该成员暴露给程序集中的任何其他类型。
答案 2 :(得分:3)
受保护的内部意味着受保护的OR内部。因此,如果通过覆盖原始程序集之外的内容,您可以将其标记为受保护的内部,那么您将允许与覆盖程序在同一程序集中的其他类调用此方法。这实际上意味着原始父母的内部封装将被违反。