連載

C#入門

第15 インターフェイスの活用

(株)ピーデー
川俣 晶
2001/11/10


インターフェイスの継承

 インターフェイスはクラスのように継承できる。以下はインターフェイスを継承した例である。

   1: using System;
   2:
   3: namespace ConsoleApplication96
   4: {
   5:   interface IBase
   6:   {
   7:     void task1();
   8:   }
   9:   interface IDerived : IBase
  10:   {
  11:     void task2();
  12:   }
  13:   class Class1 : IDerived
  14:   {
  15:     public void task1()
  16:     {
  17:       Console.WriteLine("task1() called");
  18:     }
  19:     public void task2()
  20:     {
  21:       Console.WriteLine("task2() called");
  22:     }
  23:     static void Main(string[] args)
  24:     {
  25:       Class1 c1 = new Class1();
  26:       c1.task1();
  27:       c1.task2();
  28:     }
  29:   }
  30: }
インターフェイスの継承を使用したサンプル・プログラム4
記述の方法はクラスの継承と同じだ。インターフェイスを実装しているクラスでは、継承されたメソッドも実装する必要がある。

 これを実行すると以下のようになる。

サンプル・プログラム4の実行結果
インターフェイスの継承は、大規模なインターフェイスを定義する場合に便利になる。

 ここでは、まず5〜8行目でIBaseというインターフェイスを定義している。次に、9〜12行目で、IDerivedというインターフェイスを、IBaseを継承して定義している。つまり、IDerivedには、IBaseで定義されたメソッドと、IDerived自身で定義されたメソッドが含まれるのである。そのため、IDerivedを実装するClass1では、15〜18行目と19〜22行目で、IBaseで定義されたメソッドと、IDerivedで定義されたメソッドの両方を実装している。

 この機能は大規模なインターフェイスを定義する場合に便利だといえる。基本的なインターフェイスを定義してから、それらを集めて大きなインターフェイスを定義できるからである。

プロパティ、インデクサ、イベントとインターフェイス

 メソッドだけでなく、プロパティ、インデクサ、イベントもインターフェイスに記述できる。以下は実際に記述してみた例である。

   1: using System;
   2:
   3: namespace ConsoleApplication97
   4: {
   5:   public delegate void SampleEvent(object sender, EventArgs e);
   6:   public interface ISample
   7:   {
   8:     int SampleProperty { get; set; }
   9:     string this[int index] { get; set; }
  10:     event SampleEvent sampleEvent;
  11:   }
  12:   class Class1 : ISample
  13:   {
  14:     private int sample = 0;
  15:     public int SampleProperty
  16:     {
  17:       get { return sample; }
  18:       set { sample = value; }
  19:     }
  20:     private string [] ar = new string[3];
  21:     public string this[int index]
  22:     {
  23:       get { return ar[index]; }
  24:       set { ar[index] = value; }
  25:     }
  26:     public event SampleEvent sampleEvent;
  27:     public void handler(object sender, EventArgs e)
  28:     {
  29:       ISample isample = (ISample)sender;
  30:       Console.WriteLine( isample.SampleProperty );
  31:       Console.WriteLine( isample[0] );
  32:       Console.WriteLine( isample[1] );
  33:       Console.WriteLine( isample[2] );
  34:     }
  35:     public void invokeEvent()
  36:     {
  37:       sampleEvent( this, EventArgs.Empty );
  38:     }
  39:     static void Main(string[] args)
  40:     {
  41:       Class1 c1 = new Class1();
  42:       c1.SampleProperty = 123;
  43:       c1[0] = "ABC";
  44:       c1[1] = "DEF";
  45:       c1[2] = "GHI";
  46:       c1.sampleEvent += new SampleEvent(c1.handler);
  47:       c1.invokeEvent();
  48:     }
  49:   }
  50: }
インターフェイスにプロパティ、インデクサ、イベントを記述したサンプル・プログラム5
プロパティとインデクサについては第12回で、イベントについては第13回で解説している。

 これを実行すると以下のようになる。

サンプル・プログラム5の実行結果
イベントハンドラで、プロパティおよび配列にセットした値を表示している。

 このソースコードは込み入って見えるが、書いてあることはすでに説明した知識で理解できるものばかりである。パズルを解くと思って解読してみるとよいだろう。

 なお、念のために、インターフェイスの定義部分のみ説明する。6〜11行目がこれにあたる。6行目でinterfaceの前にpublicが付いているのは、5行目のdelegateの宣言に付くpublicと水準を合わせるためのものだ。水準を合わせないとエラーになる。8行目はプロパティの宣言である。普通はgetやsetの後ろに中括弧を書いて、処理内容を書くのだが、ここはインターフェイス内なので、実装は書かない。ここでgetだけ、あるいはsetだけ書けば、読み出し専用、あるいは書き込み専用のプロパティを強制できる。9行目はインデクサだ。getとsetに関しては、プロパティと同じである。10行目はイベントを宣言している。インターフェイス内のイベントは、当然、単なる宣言にすぎないので、実装しなければ使えない。


 INDEX
  第15回 インターフェイスの活用
    1.インターフェイスの効能
  2.インターフェイスの継承
    3.同名のメソッドを持つインターフェイス
    4.ソート順を操る

「C#入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間