Внутренний сеттер с публичным геттером не работает - PullRequest
4 голосов
/ 13 июля 2011

У меня есть проблема, из-за которой в AS3 при использовании Flash Builder 4 с использованием общедоступного геттера с внутренним установщиком выдается сообщение об ошибке «свойство доступно только для чтения», например:

public function get aVar():int{ return _aVar; }
internal function set aVar(value:int):void { this._aVar = value; }

Я использовал обходной путьиз:

public function get aVar():int{ return _aVar; }
internal function setAVar(value:int):void { this._aVar = value; }

Это похоже на ошибку в AS3, или, может быть, я что-то упустил?Кто-нибудь знает лучший обходной путь?

Спасибо

Ответы [ 4 ]

5 голосов
/ 13 июля 2011

Getter и Setter должны иметь одинаковый тип доступа, это не ошибка.

2 голосов
/ 13 июля 2011

Проблема возникла раньше, и я уже упоминал об обходе в своем блоге .Проблема заключается в том, как работает связывание во Flex, поскольку ему необходимо сравнивать значения перед отправкой события связывания (по умолчанию).Однако обходной путь достаточно прост, но немного раздражает из-за дополнительного кода:

// Internal Variable
private var __state:String = "someState";

// Bindable read-only property
[Bindable(event="stateChanged")]
public function get state():String
{
    return this._state;
}

// Internal Getter-Setter
protected function get _state():String
{
    return this._state;
}

protected function set _state(value:String):void
{
    this.__state = value;
    dispatchEvent(new Event("stateChanged"));
}
1 голос
/ 13 июля 2011

Насколько я знаю, геттер и сеттер должны быть идентичны, поэтому либо публичными, либо внутренними.

В настоящее время у меня возникают проблемы с поиском документов, подтверждающих это, хотя в прошлом у меня была похожая ошибка при попытке смешать публичное и частное.

0 голосов
/ 13 июля 2011

Поскольку в AS3 нет перегрузок, не может быть никакой двусмысленности с точки зрения пространств имен.Средства доступа рассматриваются как свойства, поэтому, как и любое свойство, оно не может быть одновременно защищенным и общедоступным.В вашем случае решение, возможно, состоит в том, чтобы сделать переменные методы доступа, предназначенные для обработки защищенными (или внутренними), в то время как getter - public (и не setter).

// getter is publilc, а setter является внутренним

 public string EmployeeCode  
 {
       // getter is publilc and setter is internal
       public string EmployeeCode
       {
          get 
          { 
            return _employeeCode; 
          }

          internal set
          {
             _employeeCode = value;
          }
       }
 }  

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

...