インターフェイスの継承
インターフェイスはクラスのように継承できる。以下はインターフェイスを継承した例である。
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行目はイベントを宣言している。インターフェイス内のイベントは、当然、単なる宣言にすぎないので、実装しなければ使えない。
Insider.NET 記事ランキング
本日
月間