Свойства

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

 public var x(getter,setter) : Int;

}
Значение 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;
   }

}
Используя декларацию свойств, мы объявили три публичных поля в классе C :
  • вне класса, поле ro является полем только для чтения
  • вне класса, поле wo является полем только для записи
  • доступ к полю x осуществляется через пару методов - getX и setX
Например, следующие две функции эквивалентны, хотя методы getX и setX являются приватными и поэтому к ним нельзя обращаться напрямую, как в f2 :
    var c : C;
    function f1() {
        c.x *= 2;
    }
    function f2() {
        c.setX(c.getX()*2);
    }
Важное замечание Важно знать, что эти возможности работают только если тип класса уже известен. Обработки свойств во время выполнения нет, так что например, следующий код будет всегда выводить null т.к. метод getX никогда не будет вызван :
    var c : Dynamic = new C();
    trace(c.x);
То же происходит и со свойствами только для записи или для чтения. Они всегда могут быть изменены в объекте если тип его класса ещё неизвестен. Динамические свойства Динамический доступ может быть использован для добавления методов во время выполнения. Это довольно специфичная возможность, так что лучше использовать её осторожно. Когда к динамическому полю осуществляется доступ для чтения вызывается метод 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
    }
}

Комментарии

Взаимодействие с интерфейсами

Компилятор не пропускает такой код:

interface I {
  var x : Int;
}

class A implements I {
  public var x (default, setX) : Int;
  private function setX (v : Int) {
    x = v;
  }
}
,
ругаясь на то, что в классе A поле x имеет different property access, хотя как бы и непонятно, чем оно мешает реализации интерфейса

как это можно использовать

public var ro(default,null) : Int; - понятно, не нужно определять геттер
public var wo(null,default) : Int; - понятно, не нужно определять сеттер

public var x(getX,setX) : Int; - не понятно, тут нет никакой разницы в сравнении с
private var x : Int;
в любом случае, геттер-сеттер определить нужно

очевидно, что имеет смысл также:
public var x(default,setX) : Int;
public var x(getX,default) : Int;

и очевидно, не имеет смысла:
public var x(default:default) : Int;

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.