すべて

016 - 抽象クラス

抽象クラスとは、インスタンス化できない不完全なクラスで、子クラスで実装すべきメソッドの「型」を定義します。抽象メソッドは実装を持たず、「abstract」キーワードで宣言されます。子クラスは、継承時に必ず抽象メソッドを実装しなければなりません。設計図の役割を果たし、共通のインターフェースを強制します。

抽象クラスの学習は、堅牢なフレームワーク設計のために重要です。子クラスが必ず実装すべきメソッドを抽象メソッドとして定義することで、実装漏れを防げます。また、共通の処理を具象メソッドとして提供し、個別の処理だけを抽象メソッドにすることで、テンプレートメソッドパターンを実現できます。

具体的な使用場面を見てみましょう。ゲーム開発では、「Character」抽象クラスに「attack()」抽象メソッドと、HPや座標の管理メソッドを実装します。「Player」「Enemy」「NPC」クラスがそれぞれ継承し、攻撃方法だけを個別に実装します。データベース接続クラスでは、「Database」抽象クラスに「connect()」「query()」を抽象メソッドとし、「MySQL」「PostgreSQL」「Oracle」クラスがそれぞれのDB固有の接続方法を実装します。

抽象クラスには明確な特徴があります。抽象クラス自体はnewできませんが、参照型として使用できます。抽象メソッドと具象メソッドを混在できます。子クラスは抽象メソッドをすべてオーバーライドする必要があり、しなければコンパイルエラーになります。コンストラクタを持てますが、子クラスから呼ばれる形で使用されます。

抽象クラスを習得することで、拡張を前提とした設計ができるようになります。共通処理は抽象クラスで実装し、カスタマイズが必要な部分だけを抽象メソッドにすることで、子クラスの実装負担を減らせます。また、ポリモーフィズムと組み合わせることで、具体的なクラスに依存しない柔軟なコードが書けます。フレームワークやライブラリの設計で頻繁に使われる重要なパターンです。

前提知識としては、継承、オーバーライド、ポリモーフィズムの理解が必要です。また、インターフェイスとの違い(抽象クラスは実装を持てる、単一継承のみ)を明確に理解することが重要です。抽象クラスは、デザインパターンの多くで使われる基本的な技術です。