ゆいの学習帳

英語・プログラミング・プロモーション・日々のこと、エトセトラ。気になったことや勉強したことを、メモしていきます。

抽象クラスの必要性が、いまいちよくわからないのだけれど。

今日は、Javaの抽象クラスについてメモ。

抽象クラスとは

javaでは、類似した機能を持つクラスがいくつかある場合に、共通する機能をとあるクラスにまとめて定義しておき、個々に異なる機能をそのサブクラスで定義できる。この時のスーパークラスを抽象クラスという。

抽象クラスは抽象メソッドを持ち、そのメソッドには名前だけが定められていて、メソッドの中身はない状態です。

また、抽象クラスのサブクラスでは、必ずスーパークラスのメソッドをオーバーライドせねばなりません。

具象クラスではダメなの?

抽象クラスではないクラスは具象クラスというそうです。

さて、私の疑問は、「わざわざ抽象クラスなんて作らなくても、具象クラスを継承してオーバーライドしちゃダメなの???」と思ってました。

意見は分かれるみたいだけれど

調べてみると、重要だという人と、そうでもないという人と両方いたので、私としてはまだ結論が出せてませんが、それぞれの意見をまとめてみました。

「必要!!!!」

・サブクラス定義時にメソッドに間違いがあればコンパイルエラーが起き、コーディングミスを避けられる。 
・複数のクラスで共通の名前や呼び出し方をもつメソッドは抽象クラスで抽象メソッドとして宣言しておき、それをサブクラスで実装させるようにできる。 
・実装したら機能が存在することの保証。(オーバーライドしないといけないという特徴を活かした)
・処理内容をもたない抽象メソッドだからこそサブクラスの処理の複雑さに対応できる。
・抽象クラスが無かったら、まさに日常的に抽象的な二輪車というようなクラスを書き表すことができなくなってしまう。

「使わないよ」

Javaの進化と共にアノテーションで共有する概念を宣言したり、DIコンテナ等で共通する処理を注入するなど、別の手段が取れるようになってきているため、抽象クラスが登場する場面は減ってきている。
・親のクラスの性質をまるまる引き継ぐような概念はそう多くありません。子クラスは親クラスの性質をちゃんと引き継いでいるか確認する必要が出てくるので、テスタビリティが下がりますし。 

う〜ん、もっとコード書いてみないとわからないけれど、意見を知れてよかった!

今日はこの辺で。