2011-08-02 12 views
0

はここに私のクラスの署名です。このコード:このエラーで未定義のプロパティが

var controls:IControls = new YouTubeControls(); 
trace(controls.foo); 

結果:

Access of possibly undefined property foo through a reference with static type IControls .

私のアプリケーションが動作しません(YouTubeControls(controls))ので、コントロールをキャスト、他の「コントロール」のクラスを持っているとしています。 controls.fooにアクセスするにはどうすればよいですか?

編集
私はキャストせずにこれを行うことができない場合は、どのように私はとしてそれをキャストするクラスを知る必要の問題を扱うのですか?

+1

すべてのサブクラスに 'foo'変数がありますか? – BoltClock

+0

@BoltClock nope –

答えて

1

trace(controls.foo);は、変数であると宣言しているので、IControl(controls).fooと同じです。問題は、IControlインターフェイスにゲッター関数fooを与えていないことです。プロパティはインターフェイスでは許可されず、メソッドのみが許可されます。他の答えはこちらをご覧ください。

1

fooYouTubeControlsに定義されている場合、IControlsへの参照でアクセスすることはできません。あなたは、このようにコードを変更した場合、それは動作します:

var ytControls:YouTubeControls = new YouTubeControls(); 
trace(ytControls.foo); 
var controls:IControls = ytControls; 

をしかし、あなたは他のコントロールもfoo性を有していてもよいことを述べました。その場合は、YouTubeControlsではなく、IControlsにそのプロパティを定義する必要があります。

1

現時点ではFlash Builderにアクセスできませんが、オブジェクトがクラスであるかどうかをテストするために 'as'演算子を使用できるはずです。

if ((controls as YouTubeControls) != null) //controls IS a YouTubeControls 
              //because it didn't return null 
    trace((controls as YouTubeControls).foo); 
else 
    ... 

の利点オペレータは、それがキャストしようとしたが、それが失敗した場合、鋳造の他の形...

YouTubeControls(controls) 

は、ランタイムをスローしますが、それは、nullを返すことである「として」コントロールをYouTubeControlsとしてキャストできない場合は例外です。

1

複数のIControlがある場合は、このインターフェイスを拡張することができます。あなたのコントロールクラスのそれぞれにおける

 
    public interface IMyControl extends IControl 
    { 
     public function get foo():SomeType; 
    } 

そして

 
    public class YouTubeControls extends Controls implements IMyControl 

関連する問題