誰でもこの 2 つを混同しやすいですが、私も同じです。Li Jianzhong 先生のデザイン パターンを聞くと、彼は常に抽象クラスをインターフェイスと呼んでいます。そのため、私はさらに混乱しました。そのため、オンラインで情報を探しました。 class:
抽象クラスは特別なクラスですが、インスタンス化できません。さらに、重要なことは、抽象クラスには通常のクラスではできない抽象メソッドを含めることができるということです。抽象メソッドは抽象クラス内でのみ宣言でき、派生クラスはそれらをオーバーライドする必要があります。さらに、抽象クラスは抽象クラスから派生でき、基本クラスの抽象メソッドをオーバーライドできます。そうでない場合は、その派生クラスがそれらをオーバーライドする必要があります。
2. インターフェイス:
インターフェイスはクラスに似た参照型であり、抽象クラスとの 3 つの類似点があります。
1. インスタンス化できません。
2. 実装されていないメソッド宣言が含まれています。
3. 派生クラスは実装する必要があります。実装されていないメソッド、抽象クラスは抽象メソッド、インターフェイスはすべてメンバー (メソッドだけでなく他のメンバー) です
さらに、インターフェイスには次の特性があります:
メソッドに加えて、インターフェイスには属性とインデックスも含めることができます デバイス、イベント、これらのメンバーはパブリックとして定義されます。さらに、定数、フィールド、コンストラクター、デストラクター、静的メンバーなどの他のメンバーを含めることはできません。クラスは複数のインターフェイスを直接継承できますが、直接継承できるクラスは 1 つだけです (抽象クラスを含む)。
3. 抽象クラスとインターフェイスの違い:
1. クラスはオブジェクトを抽象化したものであり、抽象化されたクラスは抽象クラスと呼ばれます。単なる仕様または動作の規則である一方、Microsoft のカスタム インターフェイスには常に「able」フィールドが続き、「私はそれを行うことができます...」というクラスを表現しているのに対し、抽象クラスは一連の密接に関連したクラスの間でより明確に定義されています。インターフェイスはほとんどの場合、緩やかに関連しているクラスですが、すべて特定の関数を実装しています。
2. インターフェイスには基本的に継承の特定の特性はなく、呼び出すことができるメソッドのみが保証されています。
3. クラスは一度に複数のインターフェイスを実装できます。時間はかかりますが、親クラスの拡張のみです
4. インターフェイスを使用してコールバックをサポートできますが、継承にはこの機能がありません
5. 抽象クラスはシールできません。
6. 抽象クラスによって実装される特定のメソッドはデフォルトで仮想ですが、インターフェイスを実装するクラスのインターフェイス メソッドはデフォルトで非仮想になります。
7. (インターフェイス)は非抽象クラスと似ていますが、抽象クラスも、クラスの基本クラス リストにリストされているインターフェイスのすべてのメンバーに対して独自の実装を提供する必要があります。ただし、抽象クラスはインターフェイス メソッドを抽象メソッドにマップすることができます。
8. 抽象クラスは oop で原則を実装し、変更可能なものと変更不可能なものを分離します。抽象クラスとインターフェイスは不変として定義され、変更可能なシート サブクラスが実装されます。
9. 優れたインターフェイス定義には、多機能ではなく特定の機能が含まれている必要があります。そうしないと、インターフェイス汚染が発生します。クラスがこのインターフェイスの 1 つの関数のみを実装し、インターフェイスに他のメソッドを実装する必要がある場合、それはインターフェイス汚染と呼ばれます。
10. コンポーネントの機能を実装するために継承の使用を避け、ブラックボックスの再利用、つまりオブジェクトの組み合わせを使用してください。継承レベルが増加するため、最も直接的な結果は、このクラス グループ内の特定のクラスを呼び出すときに、それらをすべてスタックにロードする必要があることです。結果は想像できます (スタック原理と併せて理解します)。同時に、興味のある友人は、Microsoft がクラスを構築するときにオブジェクト結合メソッドを使用することが多いことに気づくでしょう。たとえば、asp.net では、Page クラスには Server Request などの属性がありますが、実際にはこれらはすべて特定のクラスのオブジェクトです。 Page クラスのこのオブジェクトを使用して他のクラスのメソッドやプロパティを呼び出すことは、非常に基本的な設計原則です。
11. 抽象クラスがインターフェイスを実装する場合、インターフェイス内のメソッドを実装せずに抽象クラスにマッピングし、インターフェイス内のメソッドを抽象クラスのサブクラスに実装できます。
4.抽象クラスと抽象インターフェイスの使用:
1. コンポーネントの複数のバージョンを作成することが予想される場合は、抽象クラスを作成します。抽象クラスは、コンポーネントのバージョンを制御するための簡単なメソッドを提供します。
2. 作成した機能が広範囲の異種オブジェクトにわたって使用される場合は、インターフェイスを使用します。小さくて簡潔な機能ブロックを設計したい場合は、インターフェイスを使用します。
3. 大規模な機能単位を設計する場合は、抽象クラスを使用します。コンポーネントのすべての実装間で共通の実装機能を提供する場合は、抽象クラスを使用します。
4. 抽象クラスは主に密接に関連したオブジェクトに使用され、インターフェイスは関連のないクラスに共通の機能を提供するのに適しています。
以下は私がインターネットで見たいくつかの比喩です。本当に素晴らしいです、ふふ:
1. 飛行機も鳥も飛ぶことができますが、どちらも同じインターフェイス「飛ぶ」を継承しますが、F22 は航空機抽象クラスに属し、ハトは鳥抽象クラスに属します。
2. 鉄のドアと木製のドアがすべてドアであるのと同じように (抽象クラス)、私はあなたが望むドアを与えることはできません (インスタンス化することはできません) が、特定の鉄のドアまたは木製のドアを与えることはできます (ポリモーフィズム)。それはドアであり、窓であるとは言えません (単一継承)。ドアにはロック (インターフェイス) またはドアベル (複数の実装) を含めることができます。 ドア(抽象クラス)はあなたが何であるかを定義し、インターフェイス(ロック)はあなたができることを規定します(インターフェイスは1つのことだけを行う必要があり、ロックに音を出すように要求することはできません(インターフェイス汚染))。
上記は、C# の抽象クラスとインターフェイスの違いに関する内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。