継承元クラスのプロパティを参照する手段

このQ&Aのポイント
  • ActionScrip3において、外部クラスで継承元クラスのプロパティを参照する方法について質問があります。
  • ClassAとClassBというカスタムクラスを作成し、プロパティを参照する処理を行いたいと思っています。
  • ClassBのコンストラクタからClassAのプロパティを参照しようとしたところ、一部のプロパティの値がnullになってしまいました。タイムラインから設定したプロパティの値を継承したClassBから参照・変更する方法を教えてほしいです。
回答を見る
  • ベストアンサー

継承元クラスのプロパティを参照する手段

お世話になります。 ActionScrip3に関する質問です。 現在、カスタムクラスを勉強しております。 外部クラスでClassA、ClassBを作成し、 ClassAにある処理の途中でClassBを実行し、ClassBの中からClassAのプロパティを参照しにいく 処理を行いたいと思い、ClassBのコンストラクタからClassAのプロパティをtraceしました。 プロパティppt2は「かきくけこ」が出力されましたが、ppt1は「null」になってしまいました。 恐らく、タイムラインからClassAに対して設定したプロパティの値は見にいけていないようですが、 タイムラインから設定したプロパティの値を継承したClassBから参照しにいく方法はありますでしょうか? 下記ソースと同じ方法でなくても結構ですので、タイムラインから設定した スーパークラスのプロパティ値をサブクラスから参照・変更できる方法を ご教授いただければと存じます。 お手数ではありますが、宜しくご教授ください。 宜しくお願いいたします。 /* タイムライン側の処理 -----------------------*/ var test:ClassA = new ClassA(); test.ppt1 = "あいうえお"; test.goNext(); /* ClassAの処理 -----------------------*/ package {  // インポート記述は省略  public class ClassA {   var ppt1:String;   var ppt2:String = "かきくけこ";   // コンストラクタ   public function ClassA() { }   public function goNext():void {    var classb:ClassB = new classB();   }  } } /* ClassBの処理 -----------------------*/ package {  // インポート記述は省略  public class ClassB extends ClassA {   // コンストラクタ   private function ClassB() {    trace(ppt1);    trace(ppt2); }  } }

  • Flash
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

一応 var ppt1:String; ↓ public static var ppt1:String; test.ppt1 = "あいうえお"; ↓ ClassA.ppt1="あいうえお"; としてやればお望みの動作はするでしょうけど 書いてる質問から見ると クラスとインスタンスについて あんまり理解してないですね? とりあえずstaticの意味を調べれば それで大体わかると思います

John12345
質問者

お礼

H240S18B73様 いつもありがとう御座います。 クラスプロパティについて調べました。 また、クラスプロパティを使うことで問題となっている部分も 解決することができました。

関連するQ&A

  • 参照メンバを持つクラス

    ClassAとClassBにCMyDataオブジェクトを渡したいのですが、メモリ上に同じデータのコピーを作りたくないので、コンストラクタがCMyDataの参照を受け取る設計にしました。こうすることで、CMyDataの実体はメモリ上に1つしか存在しないことになります。 ただ、クラスが、自身が管理していない外部領域にあるデータへの参照を使って仕事をするというのに違和感を感じます。 完全コンストラクタというデザインパターンがあって、クラスのインスタンスを生成する時に必要な全てのデータを渡すのが正しい流儀だそうです。 しかしこのClassA(B)の設計では、ClassA(B)の寿命が終わるまで参照先のデータが生きているとは限りません。もっといい設計はないでしょうか?ちなみにCMyDataは実際にはかなり大きなデータで、一時的であってもコピーを複数持ちたくないのです。ClassAとClassBは、実際は他のデータも参照するため1つのクラスにはしたくないのです。 class CMyData { // 色々なデータ }; class CMain { CMyData* myData; // ファイルからデータを読み込んで生成 ClassA* objA; ClassB* objB; void ReadFile() { myData = new CMyData(); // ファイルからデータを読み込みCMyData構築 } void Init() { ReadFile(); objA = new ClassA(*myData); // 自身のメンバ変数の参照でClassAを構築 objB = new ClassB(*myData); } void DoProcess() { Init(); // 実行は一度だけ objA->hoge(); // ClassAに仕事をさせる objB->foo(); // ClassBに仕事をさせる } } class ClassA { CMyData& m_data; public: ClassA(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void hoge(); } class ClassB { CMyData& m_data; public: ClassB(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void foo(); }

  • コンストラクタの記述について ―引数を持ったクラスを継承する場合―

    コンストラクタの記述について ―引数を持ったクラスを継承する場合― ActionScript3.0でプログラミングをしています。 クラスの継承に挑戦したのですが、うまくいきません。 コンストラクタの記述は、何か特別なものが必要なのでしょうか? ■コンストラクタに引数なし → 成功。 ■コンストラクタに引数あり → 失敗。  エラー「No default constructor found in base class <親クラスの名前>」。 ■エラーの出るソース↓ ・Main.as(コンストラクタ内抜粋)     var parent:Parent = new Parent(100);     var child:Child = new Child(200); ・Parent.as package {   import flash.display.Sprite;      public class Parent extends Sprite {     protected var str:String = "親クラスのプロパティ";     public function Parent(inNum:Number):void {       trace("親クラス, ", str, inNum);     }   } } ・Child.as package {   import Parent;   public class Child extends Parent {     public function Child(inNum:Number):void { //■エラー。       trace("子クラス, ", str, inNum);     }   } } ご存知の方、よろしくお願いします。 よろしくお願いします!

    • ベストアンサー
    • Flash
  • [Obj-c]元クラスからサブクラスのメソッド

    Objective-Cの勉強をしています。 ClassAは元クラス(スーパークラス)です、 ClassB1、B2はClassAを継承(サブクラス)しています。 ClassAとClassB1にはiMethodというメソッドが存在します。 最下部にソースと実行結果があります。 ●そこで質問なのですが、  ClassAのインスタンスにClassB1のインスタンスをセットすると、  同じ名前のメソッドがあるだけでなぜClassB1のメソッドが呼ばれるのでしょうか?  (下記ソースの[bangai iMethod]; の部分です。)  ClassB1のインスタンスを渡すとClassAのインスタンスが  ClassB1のメソッドを使用できる理由がわかりません、  継承しているとはいえ型が違うものを参照渡しできる理由も今ひとつわからないです。  またこれはどういう機能を言うのでしょうか?  (例えば ポリモーフィズム、動的バインディングなど) ★ソース ------------------------------------------------------------------------------ #import <Foundation/Foundation.h> // ClassA @interface ClassA : NSObject { } @end @implementation ClassA -(void) iMethod { NSLog(@"スーパークラスのインスタンスメソッドです。\n"); return; } @end // ClassB1 @interface ClassB1 : ClassA @end @implementation ClassB1 -(void) iMethod { NSLog(@"サブクラスのインスタンスメソッドです。\n"); return; } @end // ClassB2 @interface ClassB2 : ClassA @end @implementation ClassB2 @end int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... ClassB1 *instance_B1 = [[ClassB1 alloc]init]; ClassB2 *instance_B2 = [[ClassB2 alloc]init]; [instance_B1 iMethod]; [instance_B2 iMethod]; // 親には子のクラスが入れられる ClassA *bangai = instance_B1; [bangai iMethod]; } return 0; } ------------------------------------------------------------------------------ ★実行結果 サブクラスのインスタンスメソッドです。 スーパークラスのインスタンスメソッドです。 サブクラスのインスタンスメソッドです。

  • 無名パッケージのクラス

    パッケージ化されたクラス(pacA.ClassA)から、無名パッケージ(ClassB)のクラスを参照できるのでしょうか。 状況を詳しく書きますと、 ClassB はコンパイル済みで、pacA.ClassA の中で ClassB を new しています。 pacA.ClassA をコンパイルしたいのですが、ClassB を import できません(コンパイルエラー)。 それとも、ClassB は import する必要がなく、単に私のコンパイルの仕方(classpathの通し方等)が悪かったのでしょうか。 どなたか教えて頂けませんか。

    • ベストアンサー
    • Java
  • PHPでのstatic(静的)メソッド・メンバの継承について教えてください。

    次のような例にて、私の考えているように動作しません。 class ClassA {  protected static function method1()  {  echo "111";  }  public static function method2()  {  self::method1();  } } class ClassB extends ClassA {  protected static function method1()  {  echo "222";  } } ClassB::method2(); // ---> 111 と表示される。 ------ 私としては、222と表示されると予測していたのですが、 思ったように動作しません。 継承された子クラスClassBにて、method2() が実行され、 その中での self::method1(); のselfが、 ClassBではなく、親クラスのClassAを指し示していると思われます。 私としては、継承された子クラスでのselfは、相対的に、子クラスをあらわしてほしいのですが。 そういうものだ、と言われればそれまでなのですが、 これだと、self::method1(); でも、ClassA::method1(); でも同じことになってしまい、 selfの存在意義がないことになってしまうのでは?と思うのです。 私の理解のどこが間違っているのか教えていただけると幸いです。 どうぞよろしくお願いします。

    • 締切済み
    • PHP
  • クラス、メソッド、プロパティ、変数などの意味は?

    いろんなサイトやネットでいろいろ調べたのですが、 よく分かりませんでした。自分なりに考えたことですが、 (1)~(6)の用語の内容とコード上での色付けは正しいでしょうか? (1)クラス(緑枠) コンストラクタ、メソッド、プロパティを一括りにまとめたパッケージのこと。 つまり、functionの【{】と【}】の間にあるもの。 (2)オブジェクト(青枠) 関数。すなわち「複数の物や動作を入れる物」。 つまりfunctionで始まるものをオブジェクトと呼ぶ。 (3)コンストラクタ(= クラス名または関数名)(紫枠) 「構築子」のこと。オブジェクトを作る名前の部分。 つまりfunction直後に付ける関数名(クラス名)をコンストラクタと呼ぶ。 (4)プロパティ(赤枠) 「特徴」のこと。 つまりfunction内で指定された変数(var b)をプロパティと呼ぶ。 function a(){var b;}; (5)メソッド(水色枠) 「動作」のこと。 つまりオブジェクト(functionで始まるもの)が 変数(var b)に指定された場合はメソッドと呼ぶ。 var b = function a(){}; (6)変数(灰色枠) function外で指定された変数(var b)は、変数と呼ぶ。 function a(){}; var b;

  • 配列であるメンバのコンストラクタを呼ぶ方法

    C++のクラスについて教えていただけないでしょうか。以下のような場合、 class ClassA {   int A; public:   ClassA(int a): A(a) {} }; class ClassB {   ClassA A; public:   ClassB(): A(10) {} }; class ClassC {   ClassA A[2]; public:   ClassC() {} //配列であるメンバのコンストラクタを呼び出したい }; ClassBがClassAのコンストラクタを呼ぶには上記のような方法で良いと思うのですが、ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼ぶにはどのようにしたら良いのでしょうか。ご教授をお願いします。

  • Delphiのプロパティでのクラス型の取得

    プロパティにクラス型を設定した場合、セットされたことを認識するにはどうすればいいのでしょう? 言葉では伝えにくいので、ソースコードで。 TClassA = class private  FMemberA: Integer; public  property MemberA: Integer read FMemberA write FMemberA; end; TClassB = class private  FMember: TClassA;  procedure SetMember(Value: TClassA); public  constructor Create;override;  property Member: TClassA read FMember write SetMember; end; constructor TClassB.Create; begin  FMember:=TClassA.Create; end; procedure TClassB.SetMember(Value: TClassA); begin  FMember:=Value;  //<<したい処理>> end; とあって、 var Test:TClassB; begin  Test:=TClassB.Create;  Test.Member.MemberA:=5; ・・・ としたとき、TClassBのメンバーであるMemberはクラス型であるため、SetMemberは呼び出されないと思うのですが、このときに上の「したい処理」の部分のように処理を実行するにはどうすればよいのでしょうか? イメージでは、 Button.Font.Size:=10; のような感じの時に、Button側でFontの変更を知りたいということです。 よろしくお願いします。

  • クラス内からインスタンス先の名前を参照する事は出来るのでしょうか

    クラス内からインスタンス先の名前を参照する事は出来るのでしょうか 例えば function hoge(){  this.dispname=function{   alert("xxxxx");  } } を  var fuga1=new hoge();  var fuga2=new hoge(); とインスタンスして、  fuga1.dispname();  fuga2.dispname(); とした時 xxxxにそれぞれ'fuga1'、'fuga2'といった名前 を取得してセットすることは可能でしょうか? 逆なら、  alert(fuga1.constructor.name); //Alerts "hoge"  alert(fuga1.constructor.name); //Alerts "hoge" と出来る。 ※インスタンスする時に名前を渡すしかないんでしょうか。  var fuga1=new hoge('fuga1');みたいに...

  • AS3.0 カスタムクラスのMCをMainで呼び出

    AS3.0 カスタムクラスのMCをMain.asで呼び出ししたいのですが、上手く機能しません。 どうして動かないのか具体的に教えてもらえると助かります。 エラー・コード:Main.as, Line 20 1180: Call to a possibly undefined method createBox. 【Main.as】 package{ import flash.display.*; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.Timer; import boxClass; public class Main extends Sprite{ //property private var item:boxClass; //constractor public function Main(){ box(); } //method public function box():void{ item=new boxClass(); item.createBox(this); } } } 【boxClass.as】 package{ import flash.display.*; import flash.events.Event; public class boxClass extends MovieClip{//boxクラス //property private var thisClass:Object; //constractor public function boxClass():void{} //method public function createBox(tm:MovieClip):void{ thisClass = this; trace("テスト"); var mc:boxMC=new boxMC(); thisClass.addChild(mc); } } }

専門家に質問してみよう