AS3 Getter и компаньон сеттер в разных пространствах имен - PullRequest
1 голос
/ 11 октября 2011

Я пытаюсь создать свойство, которое может быть set путем расширения класса и read публично.

Я не мог придумать хорошее соглашение об именовании для свойства protected с public геттером, поэтому я попытался сделать это:

public function get name():String{ return _name; }
protected function set name(string:String):void
{
    _name = string;
}

Однако я получаю сообщение об ошибке (при попытке set name в расширяющем классе):

1178: попытка доступа к недоступному имени свойства через ссылка со статическим типом тестирования: TestComponent.

1059: свойство доступно только для чтения.

Если я изменю сеттер на public, он будет работать нормально.

Ответы [ 3 ]

4 голосов
/ 11 октября 2011

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

Обычно я не предоставляю установщик, чтобы свойство было доступно только для чтения, и непосредственно устанавливал _name внутри. Поскольку он защищен, он будет доступен для потомков.

1 голос
/ 12 октября 2011

Я выбрал немного другой подход для достижения того, чего хотел:

public function get name():String{ return _name; }
public function set name(string:String):void
{
    if(!_name.length)
        _name = string;

    else throw new Error("Property \"name\" can only be defined once.");
}

Теперь name будет определено внутри расширяющего класса, но не может быть установлено с этого момента.

1 голос
/ 11 октября 2011

Вы можете использовать его, как показано ниже.

public class Test extends Object {
    protected var _name:String;
    public function get name():String {return _name;}
}

public class Test2 extends Test {
    public function set name(s:String):void {
        this._name = s;
    }
}
...