ActionScript3.0のオブジェクト指向について学んでいるところだけど、Webでも本でも説明が不親切なところが多いよね。
だから実際に動かして試さないといけない。
まあ、このぐらいの苦労は必要なことだからいいんだけど。
アクセス制御属性。
privateはなんでもかんでも「継承されない」って書いてあるけど、それは正しくなかった。
まずインスタンス変数。
継承はされてはいるが、継承先を通してのアクセス、継承先内での直接アクセスができないということ。
継承された関数を通してならばアクセスできる。
(”継承”という単語の概念が難しい)
class A {
private var vt:int = 1; // private
public function A(init:int){
vt = init;
}
public showVt():void{
trace(vt);
}
private setVt(v:int):void{ // private
vt = v;
}
}
class B extends A{
public function B(){
super(100); // vt初期値設定
trace(vt); // コンパイルエラー
showVt(); // 出力:100
setVt(200); // コンパイルエラー
}
privateな関数は全てアクセス不可。
こうして考え直してみると、継承の概念って、二つのクラスを合成してひとつのクラスを作るのではなくて、二つのクラスがそのままの形でくっついているだけ、と考えた方がいいようだ。
そういった考えが前提にあれば、継承されている方からは継承元クラスのprivate宣言されているメンバを直接見れないのは当然だからね。
こういったことを解説で書いて欲しいよね。公式リファレンスにも書かれていない。
「privateは継承されない」と書いておいて、サンプルコードでは上記のように普通に使っているから「ハァ?」ってなるわけで。
実際に打ち込む良い機会を作ってくれたと喜ぶべきなのかもしれないけど、変な覚え方しちゃうかもしれないからね。
あと、Amebaはコードタグ対応してくれい。
全角スペースでの整形が面倒。
だから実際に動かして試さないといけない。
まあ、このぐらいの苦労は必要なことだからいいんだけど。
アクセス制御属性。
privateはなんでもかんでも「継承されない」って書いてあるけど、それは正しくなかった。
まずインスタンス変数。
継承はされてはいるが、継承先を通してのアクセス、継承先内での直接アクセスができないということ。
継承された関数を通してならばアクセスできる。
(”継承”という単語の概念が難しい)
class A {
private var vt:int = 1; // private
public function A(init:int){
vt = init;
}
public showVt():void{
trace(vt);
}
private setVt(v:int):void{ // private
vt = v;
}
}
class B extends A{
public function B(){
super(100); // vt初期値設定
trace(vt); // コンパイルエラー
showVt(); // 出力:100
setVt(200); // コンパイルエラー
}
privateな関数は全てアクセス不可。
こうして考え直してみると、継承の概念って、二つのクラスを合成してひとつのクラスを作るのではなくて、二つのクラスがそのままの形でくっついているだけ、と考えた方がいいようだ。
そういった考えが前提にあれば、継承されている方からは継承元クラスのprivate宣言されているメンバを直接見れないのは当然だからね。
こういったことを解説で書いて欲しいよね。公式リファレンスにも書かれていない。
「privateは継承されない」と書いておいて、サンプルコードでは上記のように普通に使っているから「ハァ?」ってなるわけで。
実際に打ち込む良い機会を作ってくれたと喜ぶべきなのかもしれないけど、変な覚え方しちゃうかもしれないからね。
あと、Amebaはコードタグ対応してくれい。
全角スペースでの整形が面倒。