ActionScript — свойство только для чтения и метод частного набора?

одна вещь, которую я никогда не понимал в AS3, заключается в том, что вы не можете иметь закрытый метод set и общедоступный метод get вместе.

изнутри моего класса я хотел бы присвоить значения, которые вызовут функцию частного набора:

myNumber = 22;

но мне нужно передать это число в качестве параметра функции

myNumber(22);

Например:

package
{
//Imports
import flash.display.Sprite

//Class
public class NumberClass extends Sprite
    {
    //Properties
    private var myNumberProperty:Number

    //Constructor
    public function NumberClass(myNumber:Number):void
        {
        this.myNumber = myNumber;

        init();
        }

    //Initialize
    private function init():void
        {
        trace(myNumber);
        }

    //My Number Setter
    private function set myNumber(value:Number):void
        {
        myNumberProperty = Math.max(0, Math.min(value, 100));
        }

    //My Number Getter
    public function get myNumber():Number
        {
        return myNumberProperty;
        }
    }
}

нет ли способа использовать ключевое слово set в частной функции?


person Chunky Chunk    schedule 28.03.2011    source источник


Ответы (4)


Компилятор MXML не поддерживает геттеры и сеттеры со смешанными областями/пространствами имен. По этому поводу открыто несколько тикетов:

Это довольно раздражает, но, по крайней мере, Adobe знает об этом. Существует способ реализовать смешанные геттеры и сеттеры пространств имен, используя настраиваемые пространства имен и полные ссылки на геттеры и сеттеры.

package {

    use namespace my_namespace

    public class MyClass {

        private var _name:String;

        public function get name():String {
            return _name;
        }

        my_namespace function set name(value:String):void {
            _name = value;
        }
     }

     public class MySubClass extends MyClass {

       public function MySubClass(name:String) {
           super.my_namespace::name = name;
       }
    }
  }
}
person Colin Cochrane    schedule 29.03.2011
comment
это конечно раздражает. надеюсь, это будет исправлено раньше, чем позже. - person Chunky Chunk; 29.03.2011

Есть ли причина

private function set myNumber(value:Number):void
{
    myNumberProperty = value;
}

не работает? Какую ошибку выдает? Я делал это все время во Flex, поэтому я не уверен, работает ли это только там... Однако я так не думаю.

edit: Похоже, это ошибка компилятора. Вот сообщение в блоге с решением http://blogagic.com/230/struggling-with-flex-error-1000-ambiguous-reference-to

person Bleaourgh    schedule 28.03.2011
comment
я получаю 2 ошибки времени компиляции: 1. 1059: Свойство доступно только для чтения. 2. 1178: Попытка доступа к недоступному свойству myNumber через ссылку со статическим типом NumberClass. Я использую Flash Professional CS5. - person Chunky Chunk; 29.03.2011
comment
это ошибка, которая существует как минимум с 2006 года. Это не кажется высоким приоритетом для Adobe. - person Sam; 29.03.2011

Не идеально, но не могли бы вы просто создать частный метод?

person Sam    schedule 28.03.2011
comment
абсолютно, но мне просто не нравится это делать, поскольку, как я уже упоминал, мне требуется передать значение, а не присваивать его. я всегда держу свои сеттеры и геттеры сгруппированными в нижней части моего класса, и я бы предпочел, чтобы я мог использовать ключевое слово set. но помимо того, что я придирчив, я просто думаю, что не имеет смысла не разрешать это, поскольку используются модификаторы доступа. - person Chunky Chunk; 29.03.2011

> is there no way to use the set keyword
> on a private function?<br/>

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

Идея, стоящая за сеттерами/геттерами, состоит в том, чтобы изолировать код от общедоступного.
Помните об этом ООП
Вы также должны стараться придерживаться типичного соглашения для имени переменной с ведущим _

private var _myNumber:Number

// private assessor/assignor 
  private function set number(value:Number):void{
    this._myNumber= Math.max(0, Math.min(value, 100));
  }
  private function get number():void{
    return this._myNumber;
  }


// public assessor
  public function get myNumber():Number{
    return this._myNumber;
  }


ссылка
Так называемый отчет об ошибке находится здесь

person The_asMan    schedule 29.03.2011
comment
вздох начальное подчеркивание, безусловно, больше не является соглашением, как это было в старые времена AS2. Могу я также добавить, что это очень уродливо и гетто. ржу не могу. извините, но я категорически против подчеркивания перед переменными. но возвращаясь к теме, я считаю, что задача модификаторов доступа состоит в том, чтобы изолировать код. - person Chunky Chunk; 29.03.2011
comment
Оценщики и цеденты всегда устанавливаются как публичными, так и частными или как-то еще. Я мог только представить, что должна была сделать команда компилятора, чтобы изменить это на то, что вы хотите. Что касается соглашений, если вы посмотрите на ссылку выше, вы наверняка увидите, что Adobe заявляет, что это стандартное соглашение. Гетто или нет, так это делается на многих языках, к этому привыкают. Когда вы не следуете установленным языковым стандартам, другим людям, работающим с вашим кодом, будет гораздо труднее понять уже зашифрованный код. Вы не пишете код для себя, вы кодируете для других. - person The_asMan; 29.03.2011
comment
это выбор стиля. подчеркивание (старая неприятная привычка) осталось от AS2, когда все объекты имели свойства ugly._underscore. и я не обнимаю свои функции, как вы, так как они тоже уродливы в дополнение к тому, что их фактически труднее читать, загадочны, особенно для новых разработчиков. тем не менее, я пишу свои константы заглавными буквами и символами подчеркивания и верю в возможность написания в camelCase, но не все следуют и не должны быть обязаны кодировать одинаково только из-за некоторых ненужных соглашений и только потому, что некоторые разработчики считают, что их старые привычки помогают в организации эффективной командной работы. - person Chunky Chunk; 30.03.2011
comment
Опять же, это не старая неприятная привычка, а условность, установленная разработчиками языка. Вы не обязаны с этим соглашаться, но это стандарт - person The_asMan; 30.03.2011