「スーパータイプ」とインターフェースとの比較では、基本的な抽象クラスに焦点を当てたいと思います。(非抽象基本クラスを使用できますが、一般に、抽象メンバーを持たない抽象クラスでさえ、実装/継承を目的としており、型として独立していないことを開発者に伝える傾向があります)
基本/抽象クラスとインターフェースに関しては、全体的な「ベストプラクティス」はありません。彼らは両方とも設計の実践に彼らの場所を持っています。実際、ベストプラクティスは、実装している設計から得られます。
おそらく、設計上の考慮事項に関する最大の違いは、基本/抽象クラスは継承のみが可能であるのに対し、インターフェースはあらゆる種類のクラスに実装できることです。
(編集:pilotcamははるかに優れた例を考え出しました。質問に対する彼のコメントを参照して
ください)たとえば、鳥の例から、オウム、アホウドリ、ペンギンなどのさまざまな鳥を処理したいとしますBird
。ただし、アプリケーションは型も処理しDinosaur
ます。Archeopteryxを実装することができます。Dinosaur
継承しますか、それとも継承しBird
ますか?代わりBird
にインターフェースである場合は、単純にを使用できますclass Archaeopteryx : Dinsoaur, IBird
。この例は少し工夫されていますが(確かにもっと良い例があります)、うまくいけば十分です。
もちろん、基本/抽象クラスもいいです。たとえば、アクセス修飾子を組み合わせることinternal
で、APIが実装にアクセスするメソッドを実装することを利用できますが、クラスの外部コンシューマーはアクセスできません。
どちらか一方を他方の上に使用する理由は本当にたくさんあり、どちらも実際にコーディングするのに「優れている」わけではありません。それは本当にあなたのアプリケーションのデザイン、そしておそらくあなたがコーディングしている比喩に依存します。それらのオブジェクトが表しているもの。あなたのオブジェクトは実際には鳥ですか、それとも鳥のように振る舞うだけですか?APIは気になりますか?あなたの仕事のために何を維持するのが良いでしょうか?
ここにもう少し読んでください:
インターフェースvs抽象クラス(一般的なOO)(これに「リンクされた」同様の質問すべてに注意してください)