kakts-log

programming について調べたことを整理していきます

java 抽象クラスについて

抽象クラスとは、インターフェースとは違い、抽象メソッドだけでなく、実装された具象メソッドを備えるモノである。

抽象クラスは、それ自体ではインスタンスを作成することが出来ず、そのクラスを継承したクラスを作成することで、はじめてインスタンスの作成が可能となる。

このとき、継承したサブクラスでは、継承の性質により、以下の2つの性質を持つ。

・親クラスの持つ抽象メソッドを、サブクラスが実装することを期待する
・サブクラスに対して、そのメソッドの実装を要請する。

というものである。

インターフェースとなにが違うのかというと、まだ理解が浅いところではあるが、要するにインターフェースを実装するクラスは、継承ではないので、他に親クラスを継承している場合でも、特定の機能を実装するように強制できること。
そして、抽象クラスでは、継承するサブクラスは、抽象クラスしか親にもてないので、ある程度クラス階層の構造を規定してしまうことだと思っている。

どちらもサブクラスや実装したクラスに特定の機能を持たせる点においては変わらない。

抽象クラスにおいては、実装を書いた具象メソッドも書けるので、
いくつか抽象メソッドを宣言し、それを用いて処理をおこなうテンプレートメソッドを実装し、抽象クラスの段階で既に処理の流れを形作ってしまえることが強みである。

テンプレートメソッドは、デザインパターンにおいてはfinal修飾子で定義し、サブクラスにおいて処理の流れを替えさせないのが一般的になっている。


作りたいシステムの構造を把握した上で、にたような処理の流れがあった場合に抽象クラスを用いてテンプレートを作ってしまうのは、非常に効果的である。