103

C#では、いつインターフェイスを使用すべきですか、いつ抽象クラスを使用すべきですか?決定要因は何ですか?


  • これが「正確」であることには同意しません。重複する。 - Dave Van den Eynde

4 답변


125

抽象クラスの利点は次のとおりです。

  • メソッドのデフォルト実装を指定する機能
  • 関数への不変量チェックの追加
  • "インタフェース"メソッドの呼び出し方法を少し変更する
  • 「無料」のためにインタフェースに関連する、または関連しない動作を提供する能力

インタフェースは単にデータ受け渡し契約に過ぎず、これらの機能はありません。しかし、型は1つのクラスからのみ派生することができますが、任意の数のインタフェースを実装することができるため、通常は柔軟性があります。


  • @ JaredPar:重複した質問に回答するのをやめてくれると思います(btw、私はあなたを落胆させた人ではありません) - Brann
  • @ Brann、以前はこの行動を見たことがあります。 OPに投票しても意味がないようです。詐欺師を検索する責任は自分自身にあります。 - JaredPar
  • 私はこの答えが非常に多くのupvotesを持っていて驚いて受け入れられた答えです。回答者の偏見(「抽象クラスの利点」の後に4つの利点の箇条の後に「インタフェースは単なる」が続き、インタフェースを優先する単一の「しかし」が続く)を抽象クラスに多く示すようである抽象クラスとインタフェースの違いを実際に記述する以上のものです。私は回答者を攻撃することを意味していませんが、確かにこの質問は、質問に対する最善の正義を行うより客観的な方法で述べるべきです。 - Matt
  • @Mattは、抽象クラスとインタフェースの両方に関連するすべての事実を提供するので、なぜそれが客観的なものにならないのでしょうか?私はそれが非常に良い答えだと思います。 - Gigi
  • @ Guffaの答えは、それぞれが使用されるべきときに正しく説明されるので、ずっと良い答えです。 - James Z.

71

抽象クラスとインタフェースは意味的に異なるが、その使用法は重複する可能性がある。

抽象クラスは、一般的に、類似クラスの構築基礎として使用されます。クラスに共通する実装は、抽象クラスに含まれることができます。

インターフェイスは、一般的にクラスの能力を指定するために使用されます。クラスは非常に似ている必要はありません。


7

考慮すべきもう一つは、多重継承がないので、あるクラスがあなたのインタフェース/抽象クラスから継承/継承できるが、別の基本クラスから継承できるようにするには、インタフェースを使用することです。


5

実際の質問は、インタフェースやベースクラスを使用するかどうかです。これは前に説明しました。

C#では、抽象クラス(キーワード "abstract"でマークされたクラス)は単にオブジェクトをインスタンス化できないクラスです。これは、単純に基本クラスとインタフェースを区別するのとは異なる目的を果たします。

リンクされた質問


関連する質問

最近の質問