質問

こんにちは、クラス" A"があります。抽象メソッドとして

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

派生クラス&quot; B&quot;でこのメソッドをオーバーライドしたい次の条件で

  • Bクラスに対してプライベートである必要があります。

コンパイラでは、このメソッドを派生クラス&quot; B&quot;でprivateとして宣言することはできません。 正しい構文は何ですか?

役に立ちましたか?

解決

できません。これは、クラスAで宣言されたアクセシビリティレベルに違反します。他のことは別として、クラスAからの呼び出しを禁止します。クラスAのコードがプライベートメソッドで何らかの方法でオーバーライドされた抽象メソッドを呼び出そうとした場合、どうなると思いますか?

メインの実装をプライベートにしてから、本当に必要な場合はプライベートメソッドを呼び出すだけの保護されたメソッドを作成できます。

Aから呼び出し可能に設計されている場合、そもそもなぜメソッドをプライベートにしたいのですか?

編集:さて、コメントであなたがやりたいことを説明したので、できません。最も近い方法は、デリゲートをAのコンストラクタに渡すことです。そのデリゲートはプライベートメソッドを参照できます。残念ながら、「これ」を使用することはできません。コンストラクタチェーンで引数を渡すと、「これ」をとる static メソッドを記述するなど、恐ろしいことをせざるを得なくなります。最初のパラメーターとして、事実上...ただし、適切な型にキャストする必要があります。ただし、親はどの型であるかを宣言できないためです。その後、親は保護されたメソッドの代わりにデリゲートを呼び出します。

これにより、派生クラスがさらに「オーバーライド」されるのを防ぐことに注意してください。さらに、望ましい場合と望ましくない場合があります。

これは信じられないほど曲がりくねっており、可能な限り避けるようにしています。派生クラスが何をするのか本当に心配なら、代わりにクラスを封印し、継承の代わりに構成を使用するよう人々に強制しようとします。この言語は、あなたがここでやりたいことをするのに本当に役立ちません。

他のヒント

一般的なOOPSルールとして、オーバーライド時にメンバーの可視性を減らすことはできません。したがって、保護からプライベートへの移行は許可されていません。

C#で仮想メソッドのアクセスレベルを変更することはできません。 new キーワードを使用して再宣言できますが、これは以前のメソッドを隠す再宣言であるため、宣言された型と実際の型が異なるオブジェクトを処理している場合、期待どおりに動作しません、またはオブジェクトを基本クラスタイプに定期的にキャストする場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top