32

これは、1時間前に尋ねられたextensionこの質問に対するものです。

inクラスaccess modifiersをオーバーライドする場合、を変更することはできません。名前空間のクラスを検討するvirtual methodderivedControlSystem.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()
        { }  
    }

誰もがこれを説明できますか?ありがとう

4

3 に答える 3

55

派生クラスの仮想メソッドをオーバーライドする場合、アクセス修飾子を変更することはできません。

その声明は誤りです。正確に説明する状況では、アクセス修飾子を変更できますし、変更する必要があります。他の状況では、アクセス修飾子を変更してはなりません。

仕様のセクション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の派生型
  • パオ=他のアセンブリ
于 2010-03-03T23:50:01.410 に答える
7

なぜなら、用語は異なりますが、それをオーバーライドするとprotected、メンバーの可視性が同じに保たれるからです。としてオーバーライドすることが許可されている場合protected internal、アセンブリ内の他のタイプにメンバーが突然公開されることになります。

于 2010-03-03T23:23:23.983 に答える
3

内部保護とは、保護または内部を意味します。したがって、元のアセンブリの外部でオーバーライドすることにより、内部で保護されているとマークすることが許可された場合、オーバーライドと同じアセンブリ内の他のクラスがこのメソッドを呼び出すことができるようになります。これは事実上、元の親の内部カプセル化に違反することを意味します。

于 2010-03-03T23:25:30.080 に答える