【旧コンテンツ】継承とは
オブジェクト指向のひとつの特徴に継承があります。
(このコンテンツは今後更新されまぜん。内容が古かったり、不適切な内容を含む可能性があります。)
1. 継承の例としてWinwodsのアプリケーションの部品を考える
わかりやすい継承のたとえとしてWindowsのアプリケーションについて考えて見ましょう。Windowsのアプリケーションは、だいたい同じ形をしています。上部にタイトルバーがあります、その下にメニューバーがあって、その下にツールバーがあってという具合です。メニューバーの中にはメニューがあります。ツールバーの中にはボタンがあります。
このすべてに共通のものは何でしょうか? メニュー、ツールバー、メニューアイテム、ボタンに共通なものは何でしょうか。
共通するものを探してみましょう。まず、すべての部品は位置と大きさを持ちます。
2. 継承を使用しないクラスを作成する
継承を使用しない部品の実装を考えて見ましょう。
# メニューバークラス package MenuBar; sub new { ... } sub x { ... } sub y { ... } sub width { ... } sub height{ ... } # その他のメソッドを書く。 sub method_for_menubar { ... } # ツールバークラス package ToolBar; sub new { ... } sub x { ... } sub y { ... } sub width { ... } sub height { ... } # その他のメソッドを書く。 sub method_for_toolbar{ ... } # ボタンクラス package Button; sub new { ... } sub x { ... } sub y { ... } sub width { ... } sub height { ... } # その他のメソッドを書く。 sub method_for_button{ ... }
このように3つのクラスを書きましたが、すべてのクラスは、x,y,width,height というアクセッサを共通して持っています。これってどうにかしたいですよね。
このような重複を取り除いてくれる仕組みが継承です。
3. 継承を使ってクラスを書き直す
継承を使ってクラスを書き直しましょう。少し眺めてください。
# コンポーネントクラス package Component; sub x { ... } sub y { ... } sub width { ... } sub height { ... } # メニューバークラス package MenuBar; use base 'Component'; sub new { ... } sub method_for_menubar { ... } # ツールバークラス package ToolBar; use base 'Component'; sub new { ... } sub method_for_toolbar { ... } # ボタンクラス package Button; use base 'Component'; sub new { ... } sub method_for_button { ... }
継承の方法は後々解説するとして、Component クラスに、x,y,width,height というメソッドをくくりだせたことがわかると思います。
Componentはスーパークラスと呼ばれ、Componentを継承したクラスは、x,y,width,height というメソッドを呼び出すことができます。
継承の考え方にはさまざまなものがあると思いますが、個人的には継承の役割は共通部分をくくりだすことであると考えています。
比喩的な解釈を促進するために数学の式を書いておきます。
pa + pb + pc = p(a + b + c)
左と右は式として等価ですが、3回の重複するpの記述が1回に減っています。継承の本質的な役割が理解できない場合はこの式を思い出してください。
継承とは、共通部分をくくりだして、コードの記述の重複を取り除くための機能なのです。
4. 一般的に思われがちなこと
一般的には継承のイメージは、クラスの拡張としてとらえられているかもしれません。けれどもある実装済みのクラスを拡張するために継承を使うことは、それほどありません。
継承されることを予定されるクラスを設計して、それを継承するという場合がほとんどだと思います。
つまり、継承を予定されるクラスに、共通の機能をくくりだしておくということです。