C#のインタフェースを浅く分析する


インタフェースという概念は少しも新鮮ではありません.C++、C#、Javaなどの主流言語にはインタフェースという愛らしいものが含まれています.
特に多くの複雑なタイプと継承関係が含まれている場合、比較的複雑な操作と論理関係の維持を支援することができます.憎らしいのは、表面のように簡単には使えないように見え、多くのアクセス制御に加え、インタフェース間の継承と派生が含まれているからだ.だから简単にインタフェースの総括を书いて、本を読む笔记になって、良い记忆性は腐った笔头に及ばない.
まず知識の備蓄の授業をします.
サブクラスとベースクラス、およびそれらの継承関係.くだらないことを言うな
   
   
   
   
   
  1. public class Animal 
  2.     public int NumberOfLegs; 
  3.     public void Eat() 
  4.     { 
  5.         //code to make the animal eat 
  6.     } 
  7.  
  8. public class Bird : Animal 
  9.     public double Wingspan; 
  10.     public void Fly() 
  11.     { 
  12.         // code to make the bird fly 
  13.     } 
  14.  
  15. public button1_Click(Object sender, EventArgs e) 
  16.     Bird tweety = new Bird(); 
  17.     tweety.Wingspan = 7.5; 
  18.     tweety.Fly(); 
  19.     tweety.NumberOfLegs = 2; 
  20.     tweety.Eat(); 

クラスの継承はコロンで実現され,コロンの後ろに続くのはベースクラス名である.C#では、複数の継承は許可されていません.つまり、1つのサブクラスは1つの親からのみ継承されます.これも理解できます.まるであなたが実のお父さんしかいないようです.サブクラスが親クラスを継承すると、親クラス内のすべてのpublicメソッドとprotectメソッドとフィールドが自動的に取得されます.親クラスのprivate修飾の方法とフィールドは、子クラスでは表示されません.親クラスのprotectは子クラスに対して表示され、他のクラスに対しては表示されません.あるクラスがsealedに修飾されたとき()は、他のクラスに継承されてはいけないことを示しており、太監で形容するのは適切だと思います.
サブクラスの親への継承はメソッドとフィールドの取得だけでなく、論理関係が下に延びることを保証することが最も重要です.複数のサブクラスは親クラスを持ち、親クラスのいくつかの属性を自動的に継承します.兄弟のように似ているだけで、それぞれの特徴があるに違いない(もちろん双子の特殊な状況は排除しないが、プログラム設計では何の意味もないようだ).では、兄弟の違いを保証するにはどうすればいいのだろうか.
親クラスでvirtualキーワードで修飾されるメソッドは、子クラスで書き換えることができます.メソッド名は同じですが、各サブクラスには異なる機能があります.サブクラスではoverrideで置換の準備方法を修飾する必要があります.
 
   
   
   
   
  1. public class Bird 
  2.     public virtual void Fly() 
  3.     { 
  4.         // code to make the bird fly 
  5.     } 
  6.  
  7. public class Penguin : Bird 
  8.     public override void Fly() 
  9.     { 
  10.         MessageBox.Show("Penguins can't fly!"); 
  11.     } 

鳥には共通の方法があるFly()ですが、ペンギンやダチョウのようにすべての鳥が飛べるわけではありません.書き換えはこの問題をよく解決し、鳥とペンギンの間の類継承関係を保証するとともに、異なる鳥の間の違いの問題も解決した.
次に、サブクラスへのベースクラスのアクセスについて説明します.プログラム設計では、親クラスの参照で子クラスのインスタンスを指すことができます.もちろん、子は親に対して透明であるという欠点があります.親クラスは誰が彼を継承したのか分からないし、子クラスにどんなフィールドと方法が追加されたのか分からない.したがって、親の参照は、親にすでに存在するフィールドおよびメソッドにのみアクセスできます.一見、このような制限があるように見えますが、親参照が子インスタンスを指すのは実用的な意味がないようです.しかし、実際の応用では、この小さなテクニックをリアルタイムでよく使用しています.
ベースクラスが参照する配列を使用して、サブクラスのインスタンスを保存し、親クラスの共通のメソッドとフィールドにアクセスできます.同様の方法はインタフェースにも適用され、以下に説明します.
子クラスを書くときは、親クラスに独自に定義されたコンストラクション関数がある場合は、子クラスにもコンストラクション関数が必要であることに注意してください.親クラスに複数のコンストラクション関数がある場合、サブクラスは少なくとも1つあります.親クラスのコンストラクション関数は、子クラスのコンストラクションの前に実行されます.これはよく分かります.
次にインタフェースについて説明します.
 
   
まず説明しなければならないのはインタフェースもクラスですが、彼はいつも私たちが使っているクラスより特別です.原因は主に以下の点である.
  • インタフェースには関数の定義のみがあり、実装されていません.
  • インタフェースには変数の定義はありませんが、属性を定義できます.
  • インタフェースにはコンストラクション関数がなく、インタフェース内の関数は修飾キーワード修飾にアクセスする必要はありません.すべてpublicです.
  • インタフェースにはコンストラクション関数がなく、コンパイラもデフォルトのコンストラクション関数を自動的に生成しないため、インタフェースはインスタンス化できませんが、継承できます.

  • インタフェースはクラスによってのみ実現され、このインタフェースを実現するクラスはインタフェース内のすべての方法を実現しなければならない.インタフェースは、契約のように、クラスがインタフェースに記述された特性を有することを保証します.
    インタフェースは、クラス機能の補完に似ています.クラスがこのインタフェースを実装するたびに、このインタフェースの参照を使用してクラスのインスタンスを指すことができます.もちろん、通クラスの継承と同様に、インタフェースリファレンスはインタフェースに含まれるメソッドと属性にのみアクセスできます.同時に1つのクラスは複数のインタフェースを実現することができ,もちろん責任はすべてのインタフェースの中で実現しなければならない方法である.一人でたくさんのお父さんがいるように.
    インタフェースの継承を簡単に言えば、クラスの継承とあまり違いはありません.ベースインタフェースの参照は、サブインタフェースを実装したクラスのインスタンスを指すことができる.このようにする実際の意味を考えてみましょう.インタフェースは付加的な機能と見なすことができます.多くの異なるクラスがこの機能を持つことができ、各クラスの間には必ずしも継承関係があるとは限らない.しかし、インタフェースで参照される配列を使用してアクセスできます(インタフェースのメソッドとプロパティにのみアクセスできます).
      
     
    クラスやインタフェースを含め、以前に紹介した親子関係は、下から上への変換です.この関係を逆転させる特殊な方法を紹介します.親は、子のメソッドを操作することができます.
    この機能を実現するにはisとasキーワードが必要です.
       
       
       
       
    1. public interface Isendmail 
    2.     // ,  
    3.     void sendmail(); 
    4. public class Pigeon : Bird, Isendmail 
    5.     // ...... 
    6.     void sendmail() 
    7.     { 
    8.         // send mail... 
    9.     } 
    10. Bird[] bir = new Bird[2]; 
    11. bir[0] = new Penguin(); 
    12. bir[1] = new pigeon(); 
    13.  
    14. forint i =0; i
    15.     if(bir[i] is Isendmail) 
    16.     { 
    17.         Isendmail mail; 
    18.         mail = bri[i] as Isendmail; 
    19.         mail.sendmail(); 
    20.     } 

    特に、インタフェースリファレンスは、インタフェースで宣言されたメソッドとプロパティにのみアクセスできます.
    今のところこれだけで、虚類もまとめる機会があります.