当重写派生类中的虚拟方法时,我们无法修改访问修饰符。
这种说法是错误的。你可以和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 的派生类型
- 蒙古包=其他一些组件