2010年3月4日木曜日

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

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

  1. class SuperClass0  
  2. {  
  3.  // ...  
  4. }  
  5.   
  6. class SubClass0 extends SuperClass0  
  7. {  
  8.  // ...  
  9. }  
  10.   
  11. //-----------------------------------------------------------  
  12. // get set キーワードを使う場合(エラーになる)  
  13. //-----------------------------------------------------------  
  14.   
  15. class SuperClass1   
  16. {  
  17.  protected var _class0:SuperClass0;  
  18.    
  19.  protected function set class0(value:SuperClass0):void   
  20.  {  
  21.   _class0 = value;  
  22.  }  
  23. }  
  24.   
  25. class SubClass1 extends SuperClass1  
  26. {  
  27.  protected function get class0():SubClass0  
  28.  {  
  29.   return SubClass0(_class0);  
  30.  }  
  31. }  
  32.   
  33. //-----------------------------------------------------------  
  34. // 関数を定義する場合  
  35. //-----------------------------------------------------------  
  36.   
  37. class SuperClass2  
  38. {  
  39.  protected var _class0:SuperClass0;  
  40.    
  41.  protected function setClass0(value:SuperClass0):void   
  42.  {  
  43.   _class0 = value;  
  44.  }  
  45. }  
  46.   
  47. class SubClass2 extends SuperClass2  
  48. {  
  49.  protected function getClass0():SubClass0  
  50.  {  
  51.   return SubClass0(_class0);  
  52.  }  
  53. }  

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

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

0 件のコメント:

コメントを投稿