カスタムクラスと継承について(1)
2007/11/25 22:49 - AS3.0
継承って便利ですよね。
さすがはオブジェクト指向技術三大要素の一つだけのことはあります。
ところで、基礎学習をおろそかにすると、とんだ恥をかくということを、先日受けた f-site のセミナーで痛感しましたので、ここいらでカスタムクラスを継承させる際のコードの書き方を学んでみたいと思います。
なお、このシリーズのエントリーは、徒然なるままにいろいろ書き散らすことになるでしょうから、全然体系立ったものとはならない、というか、まとまりを欠いたものにすらなる可能性があることを予告しておきます。
今回は属性キーワード internal、protected が定義されたものをインスタンスから呼び出す際の挙動について。
LiveDocs のステートメント、キーワード、ディレクティブのページには、以下のような記述があります。
属性 | 定義 |
---|---|
internal | 同じパッケージ内の参照に対して表示されます。 |
protected | 同じクラスおよび派生クラス内の参照に対して表示されます。 |
ここで以下のようなクラスファイルを用意しました。
一番の親クラスが ClassA、その ClassA を継承した子クラス ClassB、その ClassB を継承した孫クラス ClassC という構成です。
ClassA と ClassB には、それぞれプロパティとメソッドを定義します。
ClassC のインスタンスを作って、そのインスタンスから、ClassA、ClassB からそれぞれ継承しているプロパティとメソッドに対してアクセスしてみます。
var c:ClassC = new ClassC(); (1) trace( c.propA ); (2) trace( c.propAp ); (3) trace( c.propB ); (4) trace( c.propBp ); (5) c.funcA(); (6) c.funcAp(); (7) c.funcB(); (8) c.funcBp();
すると、(2)(4)(6)(8)のコードに対して以下のようなコンパイルエラーが発生します。
アクセスできないプロパティ ○○ へのアクセスを、静的型 ClassC の参照を使用して試行しました。
アクセスできないメソッド ○○ へのアクセスを、静的型 ClassC の参照を使用して試行しました。
コンパイルエラーが発生した行をコメントアウトしてコンパイルすると、期待された結果となります。
internal と protected の違いは参照可能範囲の違いだと思っていました。
それゆえ継承関係にあるクラスにおいては、親に当たるクラスのメンバは internal よりも protected を指定する方が、望ましいというか厳密というか、そういったもんだとばかり考えていました。
ところが、どうもそうじゃないんじゃなかろうか、ということが分かります。
今回のテストから確認できたのは以下の点です。
- protected 指定をすると子孫クラスのインスタンスから祖先クラスのメンバを直接参照できない
- internal を指定すると子孫クラスのインスタンスから祖先クラスのメンバを直接参照できる