Свойства

Свойства это способ декларации полей класса, который может быть использован для реализации таких особенностей, как поля только для чтения / только для записи ( read-only / write-only ) или поля, доступ к которым осуществляется только через методы getter или setter.

Вот пример объявления свойства :

class C {

 public var x(getter,setter) : Int;

}
</div>

Значение getter и setter может быть одним из следующих :
* имя метода, который будет использован, как getter/setter
* null если доступ запрещён
* default доступ осуществляется обычным обращением к полю
* dynamic если доступ осуществляется через метод, сгенерированный во время выполнения

===== Пример =====

Вот полный пример :

class C {
   public var ro(default,null) : Int;
   public var wo(null,default) : Int;
   public var x(getX,setX) : Int;

   private var my_x : Int;

   private function getX() {
       return my_x;
   }

   private function setX( v : Int ) {
      if( v >= 0 )
         my_x = v;
      return my_x;
   }

}
</div>

Используя декларацию свойств, мы объявили три публичных поля в классе C :
* вне класса, поле ro является полем только для чтения
* вне класса, поле wo является полем только для записи
* доступ к полю x осуществляется через пару методов - getX и setX

Например, следующие две функции эквивалентны, хотя методы getX и setX являются приватными и поэтому к ним нельзя обращаться напрямую, как в f2 :

    var c : C;
    function f1() {
        c.x *= 2;
    }
    function f2() {
        c.setX(c.getX()*2);
    }
</div>

===== Важное замечание =====

Важно знать, что эти возможности работают только если тип класса уже известен. Обработки свойств во время выполнения нет, так что например, следующий код будет всегда выводить null т.к. метод getX никогда не будет вызван :

    var c : Dynamic = new C();
    trace(c.x);
</div>

То же происходит и со свойствами только для записи или для чтения. Они всегда могут быть изменены в объекте если тип его класса ещё неизвестен.

===== Динамические свойства =====

Динамический доступ может быть использован для добавления методов во время выполнения. Это довольно специфичная возможность, так что лучше использовать её осторожно. Когда к динамическому полю осуществляется доступ для чтения вызывается метод get_x, для записи - метод set_x :

class C {
    public var age(dynamic,dynamic) : Int;
    public function new() {
    }
}

class Test {
    static function main() {
        var c = new C();
        var my_age = 26;
        Reflect.setField(c,"get_age",function() { return my_age; });
        Reflect.setField(c,"set_age",function(a) { my_age = a; return my_age; });
        trace(c.age); // 26
        c.age++; // вызовет c.set_age(c.get_age()+1)
        trace(c.age); // 27
    }
}
</div>