ポリモフィズム
似た機能のメソッド名を同じ名前に設定できることでアクセスの利便性を図ること。
抽象クラス、抽象メソッド
具体的な処理内容がないメソッドを抽象メソッドと呼ぶ。抽象メソッドを含むクラスを抽象クラスと呼ぶ。
抽象クラスでは、オブジェクトを生成できない。主にスーパークラスとして用いられる。
処理内容がないメソッドは、抽象メソッドと呼ばれ、ブロックを示す{}がなく、セミコロンのみ。
抽象クラスは、具象メソッドを持っていてもいいい。インターフェースは、具象メソッドを持っていてはダメ。
抽象クラスは単一継承のみ。インターフェースは多重継承が可能。
参照型のキャスト
暗黙のキャスト
サブクラスのオブジェクトをスーパークラス型の参照変数に代入できる。これには明示的なキャストは不要。
基本的にはキャストした先(スーパークラス型)のメソッドだけしか利用できないので、サブクラスのみに設定されたメソッドは使用できなくなる。
ただし、オーバーライドされたメソッドはキャストした状態から使用できる。これはたとえば、スーパークラスとサブクラスでポリモフィズム的観点から同じ用途のメソッドを用意しているようなパターンになるはず。
ダウンキャスト
スーパークラスの参照変数をサブクラスの参照変数に代入する際は明示的にキャストを行う。これをダウンキャストと呼ぶ。
シグニチャ
「シグニチャ」はメソッド名、戻り値の型、引数の型と個数を組み合わせたもの、と勉強中のテキストにはあるんだけれど、主にメソッド名と引数の型リストを指すことが多いみたい。
つまりオーバーロードとは「シグニチャが異なる」メソッドを記述する行為になる、かな。
逆に言うとオーバーロードされたメソッドを呼び出す場合は「シグニチャが一致する」ものが選ばれて実行される、ということになる、はず。これなら「signature」という単語の意味とも合致するし。
インターフェース
「インターフェース」として複数の抽象メソッドを定義しておくことができる。
- 抽象メソッドのシグニチャを定義
- 定数の定義
この2つ(だけ)を行う。実行内容は定義しない。
1つのクラスが複数のインターフェースを多重実装することもできる。
実装クラスでは、インターフェースに存在するすべての抽象メソッドを実装/オーバーライドする必要がある。もし実装していないメソッドがある場合はabstract宣言して抽象クラスにならなければならない。