カスタムクラスと継承について(2)
2007/11/26 21:38 - AS3.0
前回は、子孫クラスのインスタンスから祖先クラスのメンバを直接参照しようとすると、protected はできない、internal はできる、ということを確認しました。
ところで前回のように、子孫クラスのインスタンスから直接参照をする祖先クラスのメンバを internal や protected で指定するのがそもそも間違いなんじゃねーの? と、はたと気づきました。
LiveDocs を見ると、そういう参照をするプロパティやメソッドは、いずれも public ということになっていますし。
ただ、プロパティについては、内部実装的には privete で定義し、外部からのアクセスはセッターとゲッターを経由して行うことで、見かけ上 public にするのがオブジェクト指向的には正しいあり方である、といった文章を読んだ記憶があります。
そんなわけで、前回のクラスを基に、public として設定するアプローチを試してみたいと思います。
プロパティとメソッドに切り分けて、今回はプロパティについて試してみました。
以下のようなクラスファイルを用意しました。
継承方法は前回と同じく ClassC → ClassB → ClassA とします(今後も特に断りがない場合、Class○の○の部分が若いものほど祖先クラスとなるようにします)。
ClassA にのみ private でプロパティ _name を設定し、そのプロパティに対するゲッターとセッターを name を定義します。 ClassB と ClassC には何も定義しません。
ClassB と ClassC のインスタンスを作って、そのインスタンスから、ClassA からそれぞれ継承しているプロパティにアクセスしてみます。
var cB:ClassB = new ClassB(); trace( cB.name ); cB.name = "ClassB のインスタンスに付ける名前"; trace( cB.name ); var cC:ClassC = new ClassC(); trace( cC.name ); cC.name = "ClassC のインスタンスに付ける名前"; trace( cC.name );
特に問題なく、期待通りの結果になりました。
null ClassB のインスタンスに付ける名前 null ClassC のインスタンスに付ける名前
ClassB、ClassC は、空クラスであるにも関わらず、name というプロパティの操作が可能である、ということから以下のことが分かります。
つまり、親子クラスがある程度できあがった状態でプロパティ追加の仕様変更が生じても、当該クラスのコード書き換えだけでオッケー、ってことですね。
実にスマートなもんであります。オブジェクト指向ってスゴイなぁ。