第10章 オブジェクト指向構文 / 第2回 模擬試験
PHPの抽象クラスとインターフェースに関する次の記述のうち、正しいものはどれか。
抽象クラスは`abstract`キーワードで宣言し、直接インスタンス化できない。
正解
インターフェースはメソッドの実装(本体)を持つことができる。
1つのクラスは複数のインターフェースを実装できない。
抽象メソッドは処理内容を持ち、子クラスでオーバーライドできない。
解説
抽象クラス(`abstract class`)は、直接`new`でインスタンス化することができないクラスです。共通の実装や抽象メソッド(実装を持たないメソッド)を定義し、子クラスに継承させて使います。
他の選択肢が誤りである理由は次の通りです。
・インターフェースは、メソッドのシグネチャ(名前・引数・戻り値の型)のみを定義し、メソッドの実装(本体)を持つことはできません。
・1つのクラスは、`implements`にカンマ区切りで複数のインターフェース名を指定することで、複数のインターフェースを同時に実装できます。
・抽象メソッド(`abstract public function foo();`)は処理内容を持たず、それを継承する子クラスで必ずオーバーライド(実装)しなければなりません。
例:
```
interface Loggable { public function log(string $msg): void; }
interface Cacheable { public function cacheKey(): string; }
abstract class Base implements Loggable, Cacheable {
abstract public function log(string $msg): void; // 実装なし
}
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.4節 ポリモーフィズム p.511〜522)