
![]() |
|||
|
クラス宣言でスーパークラスを指定することによって継承を実現します。スーパークラスのメソッドは、継承されたクラスのメソッドと同じように使うことができます。 |
|||
![]() |
|||
| このトピックでは次の用語を覚えます: | |||
|
|||
![]() |
|||
|
例として、「電話(Phone)」クラスを考えてみましょう。あとからこれを継承した「留守番電話(Answerphone)」クラスを作成することにします。 電話クラスには次の2つのメソッドがあるものとします。
|
|||
|
||||
|
宣言中に virtual というキーワードがありますが、これはポリモーフィズムのためのものです(別のトピックで詳しく説明します)。 |
|||
| 継承の宣言 | |||
|
それでは「電話」クラスを継承して「留守番電話」クラスを作りましょう。といっても、実際には非常に単純な記述だけで済んでしまいます。宣言中に継承するクラスの名称(ここでは Phone)を書くだけです。 |
|||
|
||||
|
このように public キーワードによって継承元を記述するだけで、スーパークラスである「電話」のメソッドがすべて「留守番電話」でも利用できるようになります。これは、「留守番電話は電話の一種である」という Is-A 関係を表現しています。 継承によってすべてのメソッドを引き継いだ上で、「留守番電話」クラスに特有の機能を追加します。また変更が必要なメソッドをオーバーライドします。オーバーライドとは、スーパークラスに備わっているものと同じ名前のメソッドをサブクラス側で上書き定義することです。これによって、サブクラスを使用しているときにはスーパークラスのメソッドがキャンセルされ、サブクラス側の定義が採用されるようになります。ここでは |
|||
|
余談ですが、private や protected というキーワードによる継承も存在します。しかしこれらを使う必要はほとんどありません。もし、これらの継承がふさわしいと思える場面に出会ったら、コンポジションを検討してください。本来コンポジションを使うべきところでこれらの継承を誤って使う場合が多いのです。 また、public キーワードを書き忘れないようにしてください。これは、デフォルトで private として継承されるルールになっているためです。本当は public がデフォルトになっていると良いのですが、そうなってはいません。 |
|||
| スーパークラスのメソッドの流用 | |||
|
継承元の機能を継承先の実装の時に使えると便利な場合があります。「留守番電話」クラスの実装を行う場合を考えてみましょう。以下はおおざっぱな実装例です。 |
|||
|
||||
|
なお、名前が重なっていない場合は Phone:: の指定は不要です(もちろん指定しても良いです)。 |
|||
|
さて、次のトピックでは、今まで後回しにしてきた virtual キーワードの意味を説明します。 |
| もっと詳しく知りたい人は次の用語について調べると良いでしょう: | ||||
|
||||
(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)