C#のInterfaceをごみの分別で理解する

# 前置き
Qiita初めての投稿です。
c#を業務で使い初めてもうすぐ一年。早い。新米プログラマー（30歳）。もう若くない。。。
指摘どしどしお願いします。

# 参考記事
↓侍ブログさんの記事
https://www.sejuku.net/blog/87543
【C#】インターフェースって何？基礎からしっかり解説してみた！

↓未確認飛行さん（いつもお世話になってます）
https://ufcpp.net/study/csharp/oo_interface.html

# 記事の目的
アウトプットして自己成長すること
（間違っているところコメントいただけると嬉しいです）

# Interfaceってなんだろう
英和辞書で調べると
>Interface ・・・境界面、接点、共通の問題

侍ブログさんによると
>「インターフェース」の言葉自体の意味は難しめの言葉で言うと「接触面」とか「境界面」という意味です。とても簡単に言うと「何かと何かの間を繋ぐ部分」＝「インターフェース」ということです！

>アプリを使うときの操作画面は、アプリと人を繋ぐ部分なので「ユーザーインターフェース」なんて呼ばれたりします。まずは、何かと何かの橋渡しとかしてくれる仲介役なんだな～と理解しておきましょう。

未確認飛行さんによると

>インターフェース(interface)という言葉の意味は直訳すると「境界面」になります。 すなわち、物と物との間の仲介をする部分のことです。

>例えば、PC と周辺機器をつなぐ場合、 どのような物理媒体を用いて、どういう信号を送るかといった規約を定める必要があります。 このような約束事に基づいて作られたケーブルやコネクタのことをインターフェースと呼ぶわけです。

>オブジェクト指向プログラミングの世界においては、 インターフェースとはクラスが実装すべき規約（どういうメソッドにどういう引数を渡すかなど）を定めるものです。 すなわち、クラス設計者とクラス利用者の間の仲介役を担うのがインターフェースです。

なるほど、よくわからん。

のでとりあえず実装してみよう。　←え。。。

# とりあえず実装
サンプルコードはこちらに↓
https://github.com/mittsutaka/InterfaceTest

↓実践的ではないがこんなごみを捨てる処理があるとする

```c#

using System;

namespace Interface
{
    class Program
    {
        static void ThrowTrash(){
            Console.WriteLine("ごみをすてた");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("紙のごみを拾った");

            ThrowTrash();

            Console.WriteLine("ペットポトルのごみを拾った");

            ThrowTrash();
        }
    }
}
```

これだとなんの分別もせずにごみを捨てられてしまうのでここに分別の処理を書きたい

ペットボトルを捨てる場合こうなる↓

```c#
    interface ITrash
    {
        void Separation();

        void Throw();
    }

    public class ThrowPet : ITrash
    {
        public ThrowPet()
        {
            Console.WriteLine("ペットボトルを捨てよう");
        }
        public void Throw()
        {
            Console.WriteLine("ごみをすてた");
        }

        public void Separation()
        {
            Console.WriteLine("蓋を取って、ラベルをはがす");
        }
    }

    class Sample
    {
        private static void Dump(ITrash throwTrash)
        {
            throwTrash.Separation();
            throwTrash.Throw();
        }

        static void Main(string[] args)
        {
            Dump(new ThrowPet());
        }
    }

```

## 説明
```c#
interface ITrash
    {
        void Separation();

        void Throw();
    }
```
ITrashというinterfaceを作って、分別用のSeparationとごみ捨て処理のThrowを定義

```c#
public class ThrowPet : ITrash
    {
        public ThrowPet()
        {
            Console.WriteLine("ペットボトルを捨てよう");
        }
        public void Throw()
        {
            Console.WriteLine("ごみをすてた");
        }

        public void Separation()
        {
            Console.WriteLine("蓋を取って、ラベルをはがす"); 
        }
    }
```
ペットポトルを捨てるクラスにITrashインターフェイスを付けることで、
この中にThrowというメソッドとSeparationというメソッドを付けないとエラーになるようにする

※ここからコメントいただいて修正（shoe0227さんありがとうございます）
>インタフェースはメソッドの実装を強制するのも機能の一つですが、「ある処理を行える同じ型であることを保証する」のが最大の機能です。

```c#
    class Sample
    {
        private static void Dump(ITrash throwTrash)
        {
            throwTrash.Separation();
            throwTrash.Throw();
        }

        static void Main(string[] args)
        {
            Dump(new ThrowPet());
        }
    }
```
こう書くことでごみの種類を気にせず分別をして捨てることができるようになる。


## まとめ
インターフェイスはクラスに制限をつけるときに書いたり、
ある処理を行える同じ型であることを保証する場合に書く。
多人数や大規模のソースを書くときにインターフェイスを付けることで、機能を制限して、保守性、可読性を高めることが目的。
小規模のプロジェクトではあまり使う機会はないかもしれないが、知らずに使っているインターフェイスは結構あることに気づいた。

## 感想
アウトプットって難しい。
が、コメントいただくことで理解が深まるのを実感したので今後もアウトプット続けていく