c#インタフェースと抽象クラスの比較学習

3970 ワード

インタフェースとは?
インタフェースは1種の規範で、協議(*)、ある規範を守って共通のコードを書くことができることを約束します.
さまざまな機能を持つ方法のセットを定義します.インタフェースは、このような能力を持つものは何の関係もない能力を記述しています.例:
public interface  IFly{void fly();}
このインタフェースを実現したのは飛行機、鳥などで、彼らは飛ぶ能力があるが、何の関係もない.抽象類は違います
インタフェースはクラスのマルチ継承の問題を解決しました
インタフェースはクラス継承後の膨大なボリュームの問題を解決した.
インタフェース間でマルチ継承が可能
インタフェースのメンバーは実装できない必要があります(実装されていないのははっきりしていませんが、カッコはできませんよ)、インタフェースはインスタンス化できません.
インタフェースのメンバーはアクセス修飾子を持つことができず、暗黙的にpublicを公開します.
インタフェースには属性、メソッド、インデックスなどがあります(実はすべてメソッドで、Reflectorで逆コンパイルして見ることができます)が、フィールドはありません
インタフェースのすべてのメンバーは、布団クラスですべて実装する必要があります.
インタフェースの特徴のまとめ
   1.インタフェースは仕様です.多態のために.
   2.インタフェースはインスタンス化できません.
   3.インタフェースのメンバーに「アクセス修飾子」を付けることはできません.インタフェースのメンバーアクセス修飾子はpublicです.
修正できません.(デフォルトはpublic)
   4.インタフェースのメンバーには実装はできません(「言わないだけでは実行しません」は、実装されていないメンバーのセットを定義します).
   5.インタフェースにはメソッド、プロパティ、インデックス、イベントのみがあり、フィールドはありません.
   6.インタフェースとインタフェースの間で継承でき、複数継承できます.
   7.インタフェースを実装するサブクラスは、インタフェースのすべてのメンバーを実装する必要があります.
   8.1つのクラスは、1つのクラスを同時に継承し、複数のインタフェースを実装することができ、1つのサブクラスが親クラスAを同時に継承する場合、
インタフェースIAが実装されると,文法的にAはIAの前に書かなければならない.クラスMyClass:A,IA{}は,クラスが単一に継承されているためである.
   9.抽象クラスがインタフェースを実装する場合、インタフェースのメンバーを実装したくない場合は、そのメンバーをabstractに実装することができます.(抽象クラスもインタフェースを実現しabstracでタグ付け)
   10.「インプリメンテーションインタフェースの表示」は、インタフェース変数でのみ呼び出されます(インプリメンテーションインタフェースが表示された後、メンバーがprivateであるため).
 
プログラミング時:
インタフェース→抽象クラス→親クラス→具体クラス(メソッドパラメータを定義したり、値を返したり、変数を宣言したりするときに抽象で具体を使わないでください.)
インタフェースを使えば抽象クラスを使わず、抽象クラスを使えばクラスを使わず、親クラスを使えば子クラスを使わない.
「膨大なインタフェース」、「多機能インタフェース」の定義を避けると、「インタフェース汚染」が発生します.関連するメンバーのセットのみを1つのインタフェースに定義します(できるだけインタフェースでメンバーを定義しないでください).単一職責の原則
複数の職責が単一のインタフェース(小さなインタフェース)を定義します(組み合わせて使用します).
抽象クラスとインタフェースの違い
インタフェース定義クラスの共通動作、抽象クラス定義クラスの共通実装
1つのクラスは1つのクラス(抽象クラス)からのみ継承できますが、複数のインタフェースを同時に実装できます.
インタフェースには実装はできません.抽象クラスには実装されていないメンバーも実装されているメンバーもいます.
インタフェースで実装されていないメソッドはサブクラスで実装する必要があり、抽象クラスで実装されていないメンバーはサブクラスで書き換える必要があります.
良いインタフェース定義は、多機能ではなく、独自の機能性を有するべきであり、そうでなければインタフェース汚染をもたらす.
クラスがこのインタフェースの1つの機能を実現するだけで、インタフェースの他の方法を実現しなければならない場合は、インタフェース汚染と呼ばれます.次のようになります.
 
 1   Public interface  IFly
 2 
 3  4 
 5     void fly();
 6 
 7      void eat();
 8 
 9 10 
11 Class Plane:IFly
12 
13 {
14 
15     //      ,              ,         eat   。        ,     。
16 
17      void fly(){…};
18 
19        void eat(){…..};
20 }

 
抽象クラスをいつ使用するか、インタフェースをいつ使用するか
抽象クラスは主に密接なオブジェクトに使用されます.インタフェースは、関連しないクラスに汎用機能を提供するのに適しています.