(アクセス識別子) interface (インターフェイス名)
{
/* インターフェイスの定義 */
}
C#でインターフェイスを作成し利用するコードを紹介します。
こちらの記事では、抽象メソッドと抽象クラスの作成について紹介しました。
抽象クラスでは一部のメソッドを抽象メソッドとして定義できますが、すべてのメソッドを抽象メソッドとして定義し、メンバ変数やstaticメソッドを一切持たない抽象クラスはインターフェイスにできます。この記事ではインターフェイスの作成と利用のコードを紹介します。
(アクセス識別子) interface (インターフェイス名)
{
/* インターフェイスの定義 */
}
ICustomItem インターフェイスを定義する例です。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InterfaceClass
{
public interface ICustomItem
{
string getData();
int setData(string value);
int checkData();
}
}
C#ではクラスの多重継承は利用できませんが、インターフェイスであれば、多重継承が利用できます。
多重継承についてはこちらの記事を参照してください。
Windows Formアプリケーションを作成します。
下図のUIを作成します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InterfaceClass
{
public interface MyInterface
{
string value1 { get; set; }
string value2 { get; set; }
string proc();
string getText();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InterfaceClass
{
public class MyImplementAdd: MyInterface
{
public string value1 { get; set; }
public string value2 { get; set; }
public string proc()
{
return value1 + value2;
}
public string getText()
{
return value1 +", "+ value2;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InterfaceClass
{
public class MyImplementIAdd: MyInterface
{
public string value1 { get; set; }
public string value2 { get; set; }
public string proc()
{
return value2 + value1;
}
public string getText()
{
return value1 +", "+ value2;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace InterfaceClass
{
public partial class FormInterface : Form
{
public FormInterface()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MyImplementAdd mi1 = new MyImplementAdd();
mi1.value1 = textBox1.Text;
mi1.value2 = textBox2.Text;
MyImplementIAdd mi2 = new MyImplementIAdd();
mi2.value1 = textBox1.Text;
mi2.value2 = textBox2.Text;
List<MyInterface> mil = new List<MyInterface>();
mil.Add(mi1);
mil.Add(mi2);
foreach (MyInterface m in mil) {
string str = m.proc();
textBox3.Text += str + "\r\n";
str = m.getText();
textBox3.Text += str + "\r\n";
textBox3.Text += "-----\r\n";
}
}
}
}
MyInterfaceインターフェイスを実装し、MyInterfaceを持つ、MyImplementAdd, MyImplementIAdd の2つのクラスを実装しています。
MyInterfaceインターフェイスは、2つの文字列型のプロパティ(value1, value2)をもち、プロパティの値を返すgetTextメソッドと、2つの文字列を処理するprocメソッドを持ちます。
MuImplementAddクラスはprocメソッドでvalue1+value2 の値を返す実装をしています。一方ImplementIAddクラスでは、value2+value1 の値を返す実装となっています。
フォームのボタンのクリックにより、下記のコードが実行され、MyImplementAddクラスと、MyImplementIAddクラスの2つのオブジェクトのインスタンスを生成します。
MyImplementAdd mi1 = new MyImplementAdd();
mi1.value1 = textBox1.Text;
mi1.value2 = textBox2.Text;
MyImplementIAdd mi2 = new MyImplementIAdd();
mi2.value1 = textBox1.Text;
mi2.value2 = textBox2.Text;
MyInterface型のリストを宣言し作成します。作成したリストに先に作成したMyImplementAdd, MyImplementIAdd のインスタンスを追加します。それぞれ異なるオブジェクト型ですが、MyInterfaceインターフェイスを持つクラスであるため、MyInterface型のリストに追加できます。
List<MyInterface> mil = new List<MyInterface>();
mil.Add(mi1);
mil.Add(mi2);
foreach文を利用して、MyInterface型のリストに格納されているオブジェクトのproc()メソッドを呼び出し、結果をテキストボックスに表示します。合わせてgetText()メソッドも呼び出し、プロパティの値もテキストボックスに表示します。MyImplementAdd, MyImplementIAdd の2種類のオブジェクトがリストには格納されていますが、どちらのオブジェクトもMyInterfaceインターフェイスを持つため、procメソッドやgetTextメソッドの呼び出しができます。
foreach (MyInterface m in mil) {
string str = m.proc();
textBox3.Text += str + "\r\n";
str = m.getText();
textBox3.Text += str + "\r\n";
textBox3.Text += "-----\r\n";
}
プロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスに値を入力します。今回は"Penguin"と"Duck"の文字列を入力します。
[button1]をクリックします。下図の画面が表示されます。MyImplementAddクラスオブジェクトの結果と、MyImplementIAddクラスオブジェクトの両方の処理結果がテキストボックスに表示できていることが確認できます。