はじめに
この記事はプログラミングを初めて2か月たったアホの子である筆者がJava学習を開始して2週間たった時にInterfaceを理解した時の思考回路です。
基本的にドルオタ末期なのでかなりお見苦しい点も見受けられますが温かい目で見てやってください。
でも初学者の方は理解しやすい(はず)です!
そもそもInterfaceクラスとは
抽象クラス(abstractクラス)の仲間みたいなものらしいです。そもそも抽象クラスの概念自体難しいのに余計になんだこれって感じですよね...
恐らく皆さん調べた結果似たような状態になっているのではと思ってます。
本題!この説明を見ればInterfaceが理解できる!(はず)
そもそもクラスから生成されるインスタンスは実体として扱う上での話になります。
筆者は日〇坂〇6が大好きですのでその中の推しメンである小〇菜緒さん(kosakanaクラス)をJavaで作ろうと思いました。(そもそもこの時点で正気の沙汰ではない)
この際に、小〇奈緒さんは(当たり前ですが)「人」なので、human classという人としての機能(呼吸する、寝る、起きるなど)をもつクラスを継承して作ったとします。この時点でUML図っぽくするとこんな感じ↓
既にこの時点で訳分らんって方はなんでもいいのでこれ以降は好きなものに置き換えてたとえ話と思って聞いてみてください
しかしながら小〇菜緒さんは「アイドル」でもあります。そこで、idol classを作成し継承したいところですが、継承はjavaの使用上一つのclassしかできないのでできません。けど、世の中には小〇菜緒さん以外にもアイドルはたくさんいます。そんな人たち全てに(実際にはありえないですが)アイドルとしての行動(機能)、例えば踊る(danceメソッド)、歌う(singメソッド)などを定義していたら作業が大変になります。仮に定義できたとしても作っているのは人間なので、もしかしたら上〇ひなのさんには踊る(danceメソッド)能力を付与し忘れるかも知れません。
そこで、出てくるのがInterfaceです。まずはじめに、Interfaceはclassの一種です。
ここでたとえ話の続きとして、アイドルは人によって歌う曲や踊るダンス(つまりメソッドの処理内容)は違います。分かりやすく言えば、小〇菜緒さんさんは「キュン」という曲を歌って踊りますが、齋藤〇鳥さんは「裸足でsummer」を歌って踊ります。(分からなかったら人の名前や曲は知ってる歌手で置き換えてみてください)
このように、一人一人が違う曲やダンス(場合によっては曲は一緒でも違うダンス)をアイドルは歌って踊らなければなりません。(つまり同じメソッドでも違う処理をしなければならない)
そのため、プログラム上ではアイドルのインターフェイス(interface idol)を作成し、歌う(sing)や踊る(dance)などのメソッドを作るだけ作っておき、処理内容はimplement(拡張)した先のclass(インスタンス)に処理内容はお任せします。(つまりメソッドをオーバーロードする)
というところまでがInterfaceを実装する理由です。
でも恐らく、「オーバーライドするなら全部に書き込んでも一緒じゃない?」と思います。
ここから先は自分も色々な方に聞いた話と推察を交えて話しているのでご了承ください。
何故オーバーライドするのにInterfaceクラスをわざわざ作成するの?
恐らくInterfaceを作成する利点は「保守・運用性の向上およびチーム内での共通認識」のためではないかと思われます。
まず一つ目の保守・運用に関しては、コードを後から見返す際に、Interfaceがあることによって、このコードは何のコードなのかがわかりやすくなると思います。例えば、「ピ〇チュウ」(class)「ポ〇モン」(親クラス)だけ書いてあるものと、それに加えて「タイプ(でんき)」・「種類(でんきね〇みポケモン)」(Interface)が追記してあるものでは、どちらのほうが誰が見ても「ピ〇チュウ」関する解析度が高いかというところだと思います。
二つ目のチーム内での認識共有も結局は一つ目と同じような理由だと思います(チーム内でポケット〇ンスターというアニメ(プロジェクト)に対する知識の深さや理解度は多かれ少なかれみんな違うと思うので)。
長くなりましたがInterfaceの説明は以上です。
正直、私も少し前に初めて知ったところなのですべてが正しいとは言い切れません。参考程度でお願いします。