2010年3月4日木曜日

getter setter メソッドの型について

get set キーワードは、プロパティに直接アクセス出来るように見えて、そのアクセサをちゃんと用意してあげられるので、コード的の見た目的にいい機能だなと思っていたんですが、get set キーワードで作るアクセサは、その型を一致させる必要があるみたい。

class SuperClass0
{
 // ...
}

class SubClass0 extends SuperClass0
{
 // ...
}

//-----------------------------------------------------------
// get set キーワードを使う場合(エラーになる)
//-----------------------------------------------------------

class SuperClass1 
{
 protected var _class0:SuperClass0;
 
 protected function set class0(value:SuperClass0):void 
 {
  _class0 = value;
 }
}

class SubClass1 extends SuperClass1
{
 protected function get class0():SubClass0
 {
  return SubClass0(_class0);
 }
}

//-----------------------------------------------------------
// 関数を定義する場合
//-----------------------------------------------------------

class SuperClass2
{
 protected var _class0:SuperClass0;
 
 protected function setClass0(value:SuperClass0):void 
 {
  _class0 = value;
 }
}

class SubClass2 extends SuperClass2
{
 protected function getClass0():SubClass0
 {
  return SubClass0(_class0);
 }
}

とあるクラスのインスタンスを親クラスに持たせておいて、派生クラスで利用するときは、必要な型にキャストして利用しようとしたんだけど、get だけキャストして型を変えたりすると、『Error: Accessor types must match.』とエラーが出ます。

set を子クラス毎に用意したらいい話なんやけど、親クラスにもたせてあげれば用意する必要のない setter を作るのも好ましくない。get set キーワードで作成したアクセサは、クラス内で参照するのにも利用するし、コード的にも綺麗。関数を用意すると大丈夫なんだけど、クラス内で使うにはちょっと不恰好だなぁとか。

0 件のコメント:

コメントを投稿