C# インターフェイスのメリットがフワッと分かるかもしれないサンプル

①万事屋の人員データを管理するする必要が生じた為、YorozuyaMemberクラスを作りました。

```C#
//このクラスはDBから取得したエンティティクラスのつもり。
public class YorozuyaMember
{
    public string ID { get; set; }
    public string YorozuyaMemberName { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {
        //出力結果
        //1    坂田銀時
        //2    定春
        TeacherList.ForEach(t => Console.WriteLine(t.TeacherName));
        Console.ReadLine();
    }
    
    //データ登録処理
    static List<YorozuyaMember> YorozuyaMemberList = new List<YorozuyaMember>()
    {
        new YorozuyaMember{ID = "1", YorozuyaMemberName = "坂田銀時" },
        new YorozuyaMember{ID = "2", YorozuyaMemberName = "定春" }
    };
}

```

②数か月後・・・攘夷派データを管理する必要も出てきたので追加しました。

```C#
//このクラスはDBから取得したエンティティクラスのつもり。
public class YorozuyaMember
{
    public string ID { get; set; }
    public string YorozuyaMemberName { get; set; }
}
//このクラスもDBから取得したエンティティクラスのつもり。
public class JouihaMember
{
    public string ID { get; set; }
    public string JouihaMemberName { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {
        //出力結果
        //1    坂田銀時
        //2    定春
        //1    桂小太郎
        //2    エリザベス
        YorozuyaMemberList.ForEach(y => Console.WriteLine(y.ID + "    " + y.YorozuyaMemberName));
        JouihaMemberList.ForEach(j => Console.WriteLine(j.ID + "    " + j.JouihaMemberName));
        Console.ReadLine();
    }

    //万事屋データ登録処理
    static List<YorozuyaMember> YorozuyaMemberList = new List<YorozuyaMember>()
    {
        new YorozuyaMember{ID = "1", YorozuyaMemberName = "坂田銀時" },
        new YorozuyaMember {ID = "2", YorozuyaMemberName = "定春" }
    };
    //攘夷派データ登録処理
    static List<JouihaMember> JouihaMemberList = new List<JouihaMember>()
    {
        new JouihaMember{ID = "1", JouihaMemberName = "桂小太郎" },
        new JouihaMember{ID = "2", JouihaMemberName = "エリザベス" }
    };
}
```

③じゃあ、万事屋と攘夷派を無差別ミックスして名前の五十音順に表示して、という事になりました。
　とりあえず万事屋と攘夷派を1つのリストに出来ればと思ったけど、
　YorozuyaMemberListにはJouihaMemberを追加出来ず、JouihaMemberListにはYorozuyaMemberを追加出来ません。

　Listを参照する側(Programクラス)から見れば、万事屋も攘夷派も同列要素として扱いたいので、
　両クラスを同じ人間として扱えるようにPersonインターフェイスを定義し、万事屋と攘夷派に実装する事にしました。

```C#
interface Person
{
    //Programクラスから変更されないように、getのみ。
    string ID { get; }
    string Name { get; }
}
//このクラスはDBから取得したエンティティクラスのつもり。
public class YorozuyaMember : Person
{
    public string ID { get; set; }
    public string YorozuyaMemberName { get; set; }
    //インターフェイス Person の Name プロパティを実装する必要がある。
    public string Name => YorozuyaMemberName;
}
//このクラスもDBから取得したエンティティクラスのつもり。
public class JouihaMember : Person
{
    public string ID { get; set; }
    public string JouihaMemberName { get; set; }
    //インターフェイス Person の Name プロパティを実装する必要がある。
    public string Name => JouihaMemberName;
}

public class Program
{
    static void Main(string[] args)
    {
        //Personリストを作り、万事屋と攘夷派のミックスリストを作る。
        List<Person> PersonList = new List<Person>();
        PersonList.AddRange(YorozuyaMemberList);
        PersonList.AddRange(JouihaMemberList);

        //名前順にソートして表示
        PersonList.OrderBy(p => p.Name).ToList().ForEach(p1 =>
        {
            //出力結果
            //2    エリザベス
            //1    桂小太郎
            //1    坂田銀時
            //2    定春
            Console.WriteLine(p1.ID + "    " + p1.Name);
        });
        Console.ReadLine();
    }
    
    //万事屋データ登録処理
    static List<YorozuyaMember> YorozuyaMemberList = new List<YorozuyaMember>()
    {
        new YorozuyaMember{ID = "1", YorozuyaMemberName = "坂田銀時" },
        new YorozuyaMember {ID = "2", YorozuyaMemberName = "定春" }
    };

    //攘夷派データ登録処理
    static List<JouihaMember> JouihaMemberList = new List<JouihaMember>()
    {
        new JouihaMember{ID = "1", JouihaMemberName = "桂小太郎" },
        new JouihaMember{ID = "2", JouihaMemberName = "エリザベス" }
    };
}
```

万事屋クラスも、攘夷派クラスも、他のクラス(Programクラス)に対して、同じ見た目とアクセス方法(Personインターフェイス)を提供出来ました。