サブクラスに必要な機能がある場合は、抽象クラスを使用します。たとえば、基本抽象クラスのすべてのサブクラスに持たせたい一連の関数があるとします。
動作/機能に関する一般的な契約が必要な場合は、インターフェースを使用してください。さまざまなオブジェクトのセットを取りたい関数またはオブジェクトがある場合は、インターフェイスを使用します。次に、それを取得しているメソッドまたはオブジェクトを変更せずに、渡されたオブジェクトを変更できます。
インターフェースは、Abstract クラスと比較して、一般的に緩いです。インターフェイスのすべてのメソッドに対して常に同じコードを記述している状況では、インターフェイスを使用したくないでしょう。抽象クラスを使用して、各メソッドを 1 回定義します。
また、特定のオブジェクト継承階層を作成しようとしている場合、インターフェースだけでそれをしようとは思わないでしょう。
また、一部の言語では基本クラスを 1 つしか持てず、オブジェクトに既に基本クラスがある場合は、抽象基本クラスを使用するために何らかのリファクタリングを行う必要があります。これは、代わりにインターフェイスを使用したいという意味かもしれませんし、そうでないかもしれません。
@tvanfossonが指摘しているように、多くのインターフェースを使用することは悪い考えではありません。抽象クラスとインターフェースを本当に理解している場合、実際にはどちらかまたは両方の状況ではありません。特定の状況では、抽象クラスとインターフェースの両方を使用することも、どちらも使用しないこともできます。メソッドまたはオブジェクトが渡されたパラメーター オブジェクトでアクセスできるものを制限するために、単にインターフェイスを使用するのが好きな場合があります。