まず、純粋な抽象クラスは、実際には単なる多重継承ができないインターフェースであることを理解してください。
書き込みクラス、抽出インターフェースは、脳死の活動です。あまりにも多くのため、リファクタリングがあります。残念です。この「すべてのクラスがインターフェイスを取得する」パターンに従うと、混乱が発生するだけでなく、ポイントが完全に失われます。
インターフェースは、クラスができることを単に正式に修正したものと考えるべきではありません。インターフェースは、クライアントコードを使用することで必要とされる詳細によって課される契約と見なされる必要があります。
現在、それを実装するクラスが1つだけのインターフェースを書くのに、私はまったく問題ありません。実際には、クラスがまだそれを実装していないかどうかは気にしません。使用するコードに必要なものを考えているからです。インターフェイスは、使用するコードが要求するものを表現します。これらの期待を満たせば、後から何でも好きなことをすることができます。
現在、あるオブジェクトが別のオブジェクトを使用するたびにこれを行うわけではありません。境界を越えるときにこれを行います。あるオブジェクトが他のどのオブジェクトと通信しているかを正確に知りたくない場合に、それを行います。ポリモーフィズムが機能する唯一の方法です。クライアントコードが話しているオブジェクトが変更される可能性が高いと予想される場合に実行します。私が使用しているのがStringクラスの場合、私は確かにこれを行いません。Stringクラスは素晴らしく安定しているので、変更するのを防ぐ必要はありません。
抽象化ではなく具体的な実装と直接対話することを決定した場合、実装は変更しないことを信頼するのに十分安定していると予測しています。
そういうわけで、私は依存性反転の原則を気にする方法があります。盲目的にこれをすべてに適用するべきではありません。抽象化を追加するとき、クラスの実装がプロジェクトの存続期間中安定しているという選択を信用していないということです。
これはすべて、Open Closed Principleに準拠しようとしていることを前提としています。この原則は、確立されたコードを直接変更することに関連するコストが大きい場合にのみ重要です。人々がオブジェクトを切り離すことの重要性に異議を唱える主な理由の1つは、直接変更を行うときに全員が同じコストを経験するわけではないためです。コードベース全体を再テスト、再コンパイル、再配布するのが簡単な場合、直接変更で変更の必要性を解決することは、この問題を非常に魅力的に単純化する可能性があります。
この質問に対する単純な答えはありません。インターフェイスまたは抽象クラスは、すべてのクラスに追加する必要があるものではありません。実装するクラスの数を数えて、不要であると判断することはできません。それは変化に対処することです。つまり、あなたは未来を予測しているのです。間違えても驚かないでください。自分を隅に追いやることなく、できるだけシンプルにしましょう。
そのため、コードを読むためだけに抽象化を書かないでください。そのためのツールがあります。抽象化を使用して、分離が必要なものを分離します。