インターフェースなんとなく理解した
現在のプロジェクトでコードの解析を行っている際、
つまづいた部分がありました。
時間をかけて何とか理解したので、
忘れないうちに記事としてまとめておこうと思います。
あくまでなんとなく理解した程度なので、
ご了承ください。
サンプルコード
IUserInterface userLogic = null;
switch (number)
{
case 条件A:
userLogic = new class1();
break;
case 条件B:
userLogic = new class2();
break;
default:
userLogic = new class3();
break;
}
userLogic.Run();
/// <summary>
/// 処理クラスインタフェース
/// </summary>
interface IUserInterface
{
/// <summary>
/// メイン処理部
/// </summary>
void Run();
}
class class1 : IUserInterface
{
/// <summary>
/// コンストラクタ
/// <summary>
public class1()
{
}
/// <summary>
/// 処理メイン
/// </summary>
public void Run()
{
// 何かしらの処理
}
}
どこでつまずいたか
userLogic = new class1();
上記の部分でインターフェースにクラスをnewして代入するのはどうしてなのか全くわかりませんでした。
button1.Click += new EventHandler(button1_Click);
また、イベントを追加しているのかと思いましたが、
上記のようなイベント追加の書き方とは違うので余計に混乱しました。
少し調べてみて
ちょっと調べていくと、インターフェース=画面じゃないということを知りまたまた混乱していきます。
少しずつ見えてきたこと
今までの疑問をまとめると下記3つです。
- インターフェースって画面じゃないの?
- インターフェースってなにができるの?
- 結局userLogic = new class1();の意味ってなに?
1つ1つ解説していきます。
インターフェースって画面じゃないの?
画面とインターフェースについて説明すると下記のようになります。
画面→実際に表示されるウィンドウやコントロール(フォーム、ボタン、ラベルなど)
インターフェース→その画面を操作するための「コード上の窓口」
実際の処理はクラスに書かれている
インターフェースってなにができるの?
自分の解釈でいうと、インターフェースってUIの“機能ごとの役割分担”みたいなものだなと思いました。
たとえば、照明の操作アプリなら:
- 色を変えるUI → I色変更UI
- タイマーでON/OFFするUI → IタイマーUI
- 音声で操作するUI → I音声操作UI
みたいに、それぞれのUIを分けて機能を定義しておいて、分かりやすくする感じです。
個人的にはPCとかのユーザー権限に似ている気がします。
Aさん(インターフェースA)はファイルの編集ができる
Bさん(インターフェースB)はファイルの読み取りができる
みたいな感じです。
結局userLogic = new class1();の意味ってなに?
結局「userLogic = new class1();」で何をしたいかというと、インターフェースのuserLogicがclass1に書いてある処理を実行できるようにするってことです。
userLogic.Run();
サンプルコードでは上記の部分で分岐によってclass1、2.3のいずれかのRunを実行しています。
実装を切り替える意味って?
しかし、下記のように記述すればインターフェースでclass1の処理を実行できるようにする意味はないんじゃないかと思います。
class1 cls1 = new class1();
cls1.Run();
ですが、今回のように条件によってRun()の中身を変えたい場合、インターフェースを使わずに書くと、呼び出し側のコードがこうなります。
if (条件A)
{
class1 cls1 = new class1();
cls1.Run();
}
else if(条件B)
{
class1 cls2 = new class2();
cls2.Run();
}
else
{
class3 cls1 = new class3();
cls3.Run();
}
でも、インターフェースを使えば、呼び出し側をシンプルにできます
switch (number)
{
case 条件A:
userLogic = new class1();
break;
case 条件B:
userLogic = new class2();
break;
default:
userLogic = new class3();
break;
}
userLogic.Run(); // ← 呼び出し側はこれだけ!
こうすることで、呼び出し部分を変えず処理を分岐できます。
まとめ
- userLogic = new class1();はインターフェースのuserLogicがclass1に書いてある処理を実行できるようにするって意味!
- インターフェースってUIの“機能ごとの役割分担”みたいなもの!
- インターフェースを使うと呼び出し側をスッキリさせられる!
おわりに
ざっくりではありますが、インターフェースについて自分なりのまとめでした。
誰かのお役に立てば幸いです。
参考にしたサイト
【C#】インターフェイスの利点が理解できない人は「インターフェイスには3つのタイプがある」ことを理解しよう:https://qiita.com/yutorisan/items/d28386f168f2f3ab166d#qiitapostクラスにインターフェイスを定義してみる
【C#超入門】とても雑なintarface入門 ~これがモノホンのinterfaceだ~:https://qiita.com/EndOfData/items/3d866d10cd52c76da48a
Discussion