大音声インタフェース


インタフェース(転載)
 
インタフェースはオブジェクト向けプログラミング思想の優位性を体現する利器であるが,なぜそう言うのか.まず、インタフェースは継承のために存在し、継承がなければ、インタフェースはもちろん必要ありません.継承がある以上、複数のクラスに継承される可能性のあるいくつかの共通部分を抽象化する必要があります.インタフェースはこれらの共通の行為規範(方法定義)をカプセル化し、クラスは複数のインタフェースを継承することで自分の行為メカニズムを豊かにすることができます.ただしC#では、クラスは複数のクラスを継承できません.C#の最も顕著な特徴はプログラムの開発効率とメンテナンス効率を極めて向上させることであるため,複数のクラスを継承するという二義性を引き起こしやすいメカニズムには深い憎しみがある.
私たちは学生時代から歩んできたので、学生時代の行動規範を借りて現実生活のインタフェースの例にしたいと思っています.
小学校に通っていたとき、私たちは少なくとも2つの行為規範を持っていました.小学生の行為規範と少年先鋒隊員の行為規範です.まず、私たちは小学生の行為規範を守らなければなりません.次に、少年先鋒隊員であれば、少年先鋒隊員の行為規範を守らなければなりません.私たちはこの2つの行為規範についてあまり詳細な規則を列挙しないで、1つ1つで十分です.まず、少年先鋒隊員として、道を渡るときはまず信号を見なければなりません.
   1: interface IPupilRule
   2: {
   3:     void CrossTheRoad(int trafficLightIndex);
   4: }

IPupileRuleでは、関数名、戻り値タイプ、パラメータタイプなどの情報を定義する関数宣言である「道路を渡って信号を見る」という動作規範を定義していますが、関数体はありません.はい、インタフェースには関数定義という指導的な原則しかありません.関数体の存在は許されません.具体的な実現の詳細については、「具体的な問題の具体的な分析」にしましょう.次に、少年先鋒隊員の行為規範を定義し、あまり細則を列挙しないで、1つは十分で、少年先鋒隊員はタバコを吸ってはいけない.
   1: interface IYoungPioneerRule
   2: {
   3:     void NoSmoke();
   4: }

同じように、関数声明だけが細部を実現していないので、行為規則のようなものはあなたに光栄な少年先鋒隊員として絶対にタバコを吸ってはいけないことを教えてあげるしかありません.おじさんとおばさんがタバコを渡したらどう断るべきか、お父さんがタバコを吸うことを教えてくれたらどう断るべきか、すべてを教えてあげることはできません.また、中退した悪い子がタバコを吸わせたらどうやって反抗するかなどです.くだらないことは言わないで、さもなくば本当に“関数体のインタフェースを提供します”になりました.
インタフェースが関数実装の詳細を提供しない以上、小学生が道路を横断する必要がある場合は、彼自身で具体的な論理実装を完了するしかありません.
   1: public class Pupil : IPupilRule
   2: {
   3:     /// <summary>
   4:     /// Cross the road and notice the traffic light.
   5:     /// </summary>
   6:     /// <param name="trafficLightIndex">The index of traffic light.</param>
   7:     public void CrossTheRoad(int trafficLightIndex)
   8:     {
   9:         switch (trafficLightIndex)
  10:         {
  11:             case 0:     // Red, stop.
  12:                 break;
  13:             case 1:     // Yellow, stop.
  14:                 break;
  15:             case 2:     // Green, go.
  16:                 break;
  17:             default:    // Unknown situation, thinking.
  18:                 break;
  19:         }
  20:     }
  21: }

続いて、少年先鋒隊員が出場した.まず、このシーンを分析してみましょう.少年先鋒隊員は少年先鋒隊員の行為規範を守らなければならない小学生です.このように、少先隊員は前に述べた2つの行為規範のすべての規定を実現する必要があり、これもインタフェースのメリットを体現し、多重継承を実現することができる.もちろん、本明細書で使用する例では、少年先鋒隊員はIPupilRuleインタフェースを再継承して実現する必要はありません.彼は小学生である以上、Pupilという類を継承することができます.また、Pupilの小学生の行為規範に対する具体的な実現の詳細を変える必要はありません.彼は自分で少年先鋒隊員の行為規範の規定を実現すればいいだけです.
   1: public class YoungPioneer : Pupil, IYoungPioneerRule
   2: {
   3:     /// <summary>
   4:     /// Young pioneer should help other people.
   5:     /// </summary>
   6:     public void NoSmoke()
   7:     {
   8:         throw new NotImplementedException("I can't smoke because I'm a young pioneer.");
   9:     }
  10: }

また、インタフェースもインタフェースを継承することができ、多重継承することができる.私たちは日向小学校があると仮定して、この学校には自分の校則があって、校則の内容は多くなくて、主に学生に小学生の行為規範と少年先鋒隊員の行為規範を厳格に守らなければならなくて、しかもすべて校歌を歌うことができます.
   1: interface IXiangYangSchoolRule : IPupilRule, IYoungPioneerRule
   2: {
   3:     void SingSchoolSong();
   4: }

そのため、この校則は書くのが面倒ではなく、2つの既成の行為規範を受け継ぎ、自分の要求を少し増やせばいいのです.向陽小学校の学生はみなこの校則を守らなければならない.
   1: public class XiangYangPupil : IXiangYangSchoolRule
   2: {
   3:     public void SingSchoolSong()
   4:     {
   5:         Console.WriteLine("I love Xiang Yang School!");
   6:     }
   7:  
   8:     public void CrossTheRoad(int trafficLightIndex)
   9:     {
  10:         throw new NotImplementedException();
  11:     }
  12:  
  13:     public void NoSmoke()
  14:     {
  15:         throw new NotImplementedException();
  16:     }
  17: }

以上の紹介を通じて、あなたはすでにどのようにインタフェースを使うかについていくつかの初歩的な認識を持っていて、実際の問題に直面する時、合理的に分析して設計すれば、インタフェースはきっと私たちの開発の仕事に大きな便利さをもたらします!