派生クラスの仮想メソッドをオーバーライドする場合、アクセス修飾子を変更することはできません。
その声明は誤りです。正確に説明する状況では、アクセス修飾子を変更できますし、変更する必要があります。他の状況では、アクセス修飾子を変更してはなりません。
仕様のセクション10.6.4を参照してください。
オーバーライド宣言は、仮想メソッドのアクセシビリティを変更できません。ただし、オーバーライドされたベースメソッドが内部で保護されており、オーバーライドメソッドを含むアセンブリとは異なるアセンブリで宣言されている場合は、オーバーライドメソッドの宣言されたアクセス可能性を保護する必要があります。
推論は簡単です。
あなた、アサドは銀行口座、BankAccountを持っています。
あなたは家を持っています。あなたはハウスの部屋を親友のチャーリーに借ります。
チャーリーには、アパートに住む息子のデイビッドがいます。
あなたには、コンドミニアムに住む息子のエルロイがいます。
エルロイには、パオに住む息子、孫のフランクがいます。
エルロイには、彼と一緒にコンドミニアムに住む親友のグレッグがいます。
あなたはあなた自身、ハウスに住むすべての人、そしてあなたの子孫にあなたの銀行口座へのアクセスを許可します。したがって、銀行口座にアクセスできるのは、Asad、Charlie、Elroy、およびFrankです。
ダビデはあなたでもあなたの子孫でもないし、ハウスに住んでいないので、アクセスできません。彼があなたの同居人の子供であるということは無関係です。彼はあなたのBankAccountにアクセスできません。
グレッグはあなたの銀行口座にもアクセスできません。彼はあなたの子孫ではありません。彼は家に住んでいません。彼があなたの子孫と一緒に住んでいるという事実は、彼にあなたの子孫と同じ権利を与えるものではありません。
今、私たちは問題の核心に到達します。Elroyは、銀行口座へのアクセスをGregに拡張することは許可されていません。あなたはその銀行口座を所有していて、「私自身、私の子孫、そして私の家の仲間」と言いました。あなたの子供には、あなたが最初に設定したものを超えてBankAccountのアクセシビリティを拡張する権利がありません。
ElroyがBankAccountへのアクセス権について説明するとき、彼は「これへのアクセス権を自分自身と私の子孫に許可します」とだけ言うことができます。これは、あなたがすでに許可していることだからです。彼は「私は自分自身、私の子孫、そしてコンドミニアムの他の居住者に銀行口座へのアクセスを許可する」とは言えません。
ただ明確にします:
- 私と私の子孫はアクセス=保護されたアクセスを取得します
- 私と私のハウスメイトはアクセス=内部アクセスを取得します
- 私と私の子孫と私のハウスメイトはアクセスを取得します=保護された内部アクセス
- コントロール=アサド
- CreateChildControls = BankAccount
- ハウス=System.Web.DLL
- チャーリー=System.Web.DLLの任意のタイプ
- David=アセンブリApartment.DLLのチャーリーの派生型
- Elroy = someClass
- コンドミニアム=SomeClassを含むアセンブリ
- Greg=Condo.DLLの他のクラス
- フランク=Yurt.DLLのsomeClassの派生型
- パオ=他のアセンブリ