ということで、やっとオブジェクト指向プログラミング言語の3つの概念に着手です。
・インヘリタンス(継承)
・ポリモーフィズム(多態性)
・ダイナミックバインディング(動的束縛)
インヘリタンス(継承)
これは文字通り、スーパークラスからサブクラスへプロパティやメソッドが継承されるって意味なのだが、まずはスーパークラス/サブクラスって何よ?って話。
クラスとは、数あるコードを使いやすくするためにグループ化したもので、このクラスにもスーパークラスとサブクラスというものがある。
あまり例え話は好きじゃないけど・・・・
例えば、生物をクラス分けすると佐藤さんはどのクラスに属するかを検証。
佐藤さんは人間で、人間は哺乳類。
これをクラスにすると、こうなる。
スーパークラス=哺乳類
サブクラス=人間
佐藤さん=人間クラスのインスタンス
哺乳類は胎生で生まれて母乳で育てますよね。
この機能をサブクラスが、スーパークラスから継承していて、
それに人間の機能を追加したのが人間クラスになる。
そのインスタンスが佐藤さんで、人間クラスの機能を備えている。
これが継承。
で、アクションスクリプトでいうとスーパークラスってどれになるの?ってとこだけど
リファレンスみても「これがスーパークラスです」って出てこないんですよね。
で、こんな記述を発見。
ActionScript2.0 コンポーネントリファレンスより引用
Flash でのサブクラスの作成について
オブジェクト指向プログラミングでは、サブクラスは、スーパークラスと呼ばれる別のクラスのプロパティとメソッドを継承できます。コアクラスおよび Flash Player ActionScript クラスの多くと同じように、独自のカスタムクラスを拡張することができます。TextField クラスは拡張できません。
2 つのクラス間にこのような関係を作るには、class ステートメントの extends 節を使用します。スーパークラスを指定するには、次のシンタックスを使用します。
class SubClass extends SuperClass {}
SubClass に指定したクラスは、SuperClass によって定義されているプロパティとメソッドをすべて継承します。
ってことは、スーパークラスってのは、aクラスのスーパークラスはAクラス、bクラスのスーパークラスはBクラスっていう風に、サブから見てスーパーなだけで、親子関係に似ている感じかな。
で、この記事はカスタムクラスを作成する記事なんだけど、自分でサブクラスを作れちゃうんだな。その自分で作ったサブクラスをカスタムクラスという。
このカスタムクラスを作るときに、アクションスクリプトで既に定義されているクラスをスーパークラスとして指定できるよって話。
でもって、アクションスクリプトのクラスもObjectクラスからサブクラスへ継承されて、さらにサブクラスへ継承されているといった構造になっている模様。
ActionScript3.0 コンポーネントリファレンス
リファレンスで適当にクラスを覗いてみると、「継承」という項目がある。
例えばArrayクラスを見ると「継承 Array→Object」って書いてある。
他のクラスも覗いてみると、継承の最後はObjectになってる。
つまり、Objectクラスが大元ってこと。
Objectクラス
そこで、オブジェクトクラスを覗いてみると、うわっ!って思うほどのサブクラスの羅列。
でもここに書かれているのは、Objectクラスのサブクラスで、全てのクラスじゃないだな。
つまりArray→Objectって書いてるやつだけで、XMLSocket→EventDispatcher→Objectとかなってるやつは含まれてない。
なぜならXMLSocketはEvetDispatcherのサブクラスだから。
次に、継承って何が継承されてるの?って話。
リファレンスでArrayクラスを覗いてみる。
ActionScript3.0 リファレンス Arrayクラス
このクラスに含まれるプロパティ・クラス・定数が書いてあり、
右端に「定義元」って書いてる。
Arrayの場合はObjectかArrayのいずれかが書いてあり、Objectと書かれた欄の左端には上向き矢印が付いてる。
これはObjectクラスから継承されたもの。
Arrayと書かれたものが、「拡張」または「オーバーライド」されたもの。
拡張というのは、追加することで、オーバーライドは変更すること。
つまり、サブクラスには、スーパークラスからそのまま継承したものと、新たに追加したものと、内容を変更したものがある。