C#やJavaなどのオブジェクト指向型プログラミング言語に用意されている抽象クラスとインターフェースですが、コード的な違いは理解していても使い分けまでできているケースは意外と少ないです。中級未満のエンジニアだと、そもそも抽象クラスやインターフェースを使うことすらしない場合も。決して自分が完璧に理解し、使いこなしていると自負しているわけではないのですが、中級者レベルの理解と使い分けについてまとめます。
抽象クラスとインターフェースの違い
文法的(コード)な違い
- インターフェースは実装を持てないが、抽象クラスは実装を持つことができる
- 具象クラスはインターフェースを複数実装できるが、抽象クラスは1つしか継承することができない
教科書的には上記が主な違いになります。ただ、上記の文法的な違いだけを根拠に使い分けているとコードは保守性、拡張性を落としてしまいます。
- 異なる実装の処理を同じインスタンスとして使用したいからインターフェースを使う
- 処理を共通化したいから抽象クラス使う
- 複数使いたいからインターフェースを使う
この考えはオブジェクト指向ではありません。