インターフェースとクラスは日常の開発でよく使用されます。この 2 つの違いは何ですか?メリットとデメリットは何ですか?次の記事では、.NET のインターフェイスとクラスの違いに関する関連情報を紹介します。必要な方は一緒に参照してください。
はじめに
インターフェイスは .Net で提供されており、Class や Struct の型定義とは異なることを誰もが知っているはずです。場合によっては、インターフェイスが抽象クラスと同じであるように見えるため、.Net では抽象クラスをインターフェイスで完全に置き換えることができると考える人もいます。実際にはそうではありません。インターフェイスと抽象クラスにはそれぞれ長所と短所があるため、アプリケーションでは相互に補完するために組み合わせて使用されることがよくあります。以下では多くを語る必要はありません。詳細な紹介を見てみましょう。
次に、抽象クラスとインターフェイスの違いについて話しましょう:
最初の違いは、この 2 つによって表現される概念が異なるということです。抽象クラスは、モノのクラスを高度に集約したものであるため、抽象クラスを継承するサブクラスの場合は「はい」の関係になります。インターフェイスは動作の仕様を定義するため、インターフェイスを実装するサブクラスの場合は、インターフェイスに対して「」になります。動作はインターフェイスに従って完了する必要があります。」少し嘘っぽく聞こえるかもしれませんが、ここに例を示します。たとえば、犬はすべての犬科の動物の総称であり、ペキニーズは犬であり、シェパードは犬です。すると、犬の一般的な特徴はペキニーズとシェパードに見出されます。したがって、ペキニーズとシェパードを比較すると、犬はそれに属します。この種の抽象的なタイプの「吠える」という行為については、犬も吠えますし、鳥も吠えます。明らかに、前者は抽象クラスに相当し、後者はインターフェイスを参照します。
違い 2: 抽象クラスで型メソッドを定義する場合、メソッドの実装部分は指定される場合もあればされない場合もありますが、インターフェイスの場合は、その中で定義されているメソッドに実装部分を指定することはできません。
例:
publicabstractclassAbsTest { publicvirtualvoidTest() { Debug.WriteLine("Test"); } publicabstractvoidNewTest(); } publicinterfaceITest { voidTest(); voidNewTest(); }
違い 3 は、継承クラスには、2 つに関係するメソッドの実装が異なります。継承されたクラスは、抽象クラスによって定義された抽象メソッドを書き直す必要はありません。つまり、抽象クラスのメソッドは、インターフェイス クラスによって定義されたメソッドまたは属性に対して拡張できます。対応するメソッドは、継承されたクラスとプロパティが実装されます。
違い 4: 抽象クラスでは、メソッドを追加する場合、そのメソッドを継承クラスの処理に使用する必要はありません。ただし、インターフェイスの場合は、新しく定義されたメソッドを提供するために継承クラスを変更する必要があります。
2 つの違いを理解したところで、抽象クラスに対するインターフェイスの利点について話しましょう。
利点 1: インターフェイスは参照型だけでなく値型にも作用できます。抽象クラスに関しては、参照型に対してのみ機能します。
利点 2: .Net の型継承は単一継承のみです。つまり、型は 1 つの型のみを継承できますが、複数のインターフェイスを継承できます。実際、私もこの点に同意します。多重継承は継承ツリーを混乱させます。
利点 3: インターフェイスはプロパティとメソッドのみを定義し、実際に実装された型とはほとんど関係がないため、インターフェイスは複数の型で再利用できます。対照的に、抽象クラスと継承クラスの関係はより密接です。
利点 4: インターフェイスを通じて、型によって公開される属性とメソッドを減らすことができ、型オブジェクトの保護が容易になります。インターフェイスを実装する型に他のメソッドまたは属性が含まれる可能性があるが、メソッドが戻るときにインターフェイス オブジェクトを返すことができる場合、呼び出し側は、によって提供されるメソッドまたは属性を通じてのみオブジェクトの関連要素にアクセスできます。他の要素を効果的に保護できるインターフェイス。
利点 5: 値型のアンボックス化操作を削減します。 Structで定義された値型データは、コレクションに格納した場合、取り出すたびにアンボックス化する必要があるため、アンボックス化の手間を軽減するためにStruct+Interfaceを組み合わせる方法を採用しています。
抽象クラスと比較して、インターフェイスには非常に多くの利点がありますが、インターフェイスには致命的な弱点があります。つまり、インターフェイスによって定義されたメソッドとプロパティは、それを継承する型に対してのみ相対的であることができます(インターフェイスによって定義された関数が継承されたクラス マークで変更されます)、多層の継承関係の場合、インターフェイスのみを使用して実装するのは困難です。なぜなら、各型がインターフェイスを継承して実装する場合、コードの記述がより煩雑になることは言うまでもなく、特にサブタイプ オブジェクトがアクセスのために暗黙的に基本クラス オブジェクトに変換される場合、実行結果が間違っている場合があるからです。
現時点では、仮想メソッドと組み合わせたインターフェイスを使用して実装する必要があります。実際、継承ではインターフェイスと抽象クラスのどちらを使用すべきでしょうか?インターフェイスは固定されており従来型であるため、インターフェイスの対応するメソッドとプロパティの実装は、継承されたクラスで提供される必要があります。抽象クラスの場合、抽象クラスの定義メソッドの実装は継承ツリー全体で実行されるため、メソッドの実装または書き換えは不確実です。したがって、相対的に言えば、抽象クラスはインターフェイスよりも柔軟です。
2 つの簡単な比較表を以下に示します。
インターフェース |
抽象クラス |
|
多重継承 |
サポートされている |
サポートされていない |
タイプ制限 |
いいえ |
はい、参照型のみにすることができます |
メソッドの実装 |
メソッドの実装は継承された型で指定する必要があります |
指定する必要はありません継承されたクラス内 |
拡張性 |
もっと面倒 |
比較的柔軟 |
多層継承 |
もっと面倒だし仮想関数を使用する必要があります |
より柔軟に |
合計 一般的に言えば、インターフェイスと抽象クラスは、型間の継承関係をより適切に実現するために .Net によって提供される言語手段であり、この 2 つは互いにある程度補完的です。したがって、何を使用するか、何を使用しないかを強調しません。問題の鍵は、これら 2 つの方法をプログラムにどのように合理的に適用するかです。
以上が.NET のインターフェイスとクラスを比較するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。