私はObjCでコーディングしていますが、この質問は意図的に言語に依存しません-ほとんどのオブジェクト指向言語に適用されるはずです
「Collection」クラスがあり、「Collection」から継承する「FilteredCollection」を作成するとします。フィルタはオブジェクトの作成時に設定され、それ以降、クラスはそのコンテンツにフィルタが適用された「コレクション」のように動作します。
私は物事を明白な方法で行い、コレクションをサブクラス化します。私はすべてのアクセサーをオーバーライドし、かなりきちんとした仕事をしたと思います-FilteredCollectionはコレクションと同じように動作するように見えますが、ユーザーにフィルターで除外されているフィルターに対応するオブジェクトが含まれています。FilteredCollectionsを作成して、コレクションとしてプログラムに渡すことができると思います。
しかし、私はテストに来て、-ああ、いや-それは機能していません。デバッガーを詳しく調べてみると、一部のメソッドのCollection実装が、オーバーライドされたFilteredCollectionメソッドを呼び出していることがわかります(たとえば、Collectionがオブジェクトを反復処理するときに依存する「count」メソッドがありますが、フィルター処理されたカウントを取得しています。 、正しい外部動作を与えるためにcountメソッドをオーバーライドしたため)。
ここで何が問題になっていますか?OOもこのように機能する必要があるように感じられるにもかかわらず、いくつかの重要な原則に違反しているように感じるのはなぜですか?この問題の一般的な解決策は何ですか?ありますか?
ちなみに、特にこの問題の良い「解決策」は、オブジェクトをコレクションに入れる前にフィルタリングすることであり、コレクションをまったく変更する必要がないことを知っていますが、より一般的な質問をしていますそれよりも-これは単なる例です。より一般的な問題は、サブクラスによって変更される可能性のある他のメソッドの動作に依存する不透明なスーパークラスのメソッドと、このような動作を変更するためにオブジェクトをサブクラス化する場合の対処方法です。