7

こんにちは、抽象メソッドとしてクラス「A」を持っています

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

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

  • Bクラス専用にしてください。

コンパイラは、派生クラス "B" でこのメソッドをプライベートとして宣言することを許可していません。正しい構文は何ですか?

4

3 に答える 3

9

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

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

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

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

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

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

于 2009-11-29T19:00:12.210 に答える
2

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

于 2009-11-29T19:00:56.123 に答える
0

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

于 2009-11-29T19:01:36.497 に答える