Свойство ActionScript - Public Getter, Protected Setter - PullRequest
4 голосов
/ 09 сентября 2011

Можно ли иметь свойство с открытым и защищенным сеттерами?

У меня есть следующий код:

public class Mob extends Sprite {
    // snip

    private var _health:Number; // tried making this protected, didn't work
    public function get health():Number { return _health; }
    protected function set health(value:Number):void {
        _health = value;
    }

    // snip

    public function takeDamage(amount:Number, type:DamageType, ... additionalAmountAndTypePairs):void {
        var dmg:Number = 0;
        // snip
        var h:Number = this.health; // 1178: Attempted access of inaccessible property health through a reference with static type components.mobs:Mob.
        this.health = h - dmg; // 1059: Property is read-only.
    }
}

У меня было this.health -= dmg;, но я разделил его, чтобы получить более подробную информацию об ошибках компилятора.

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

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

Ответы [ 3 ]

5 голосов
/ 09 сентября 2011

Нет, права доступа должны иметь одинаковые уровни привилегий друг с другом. Вы можете иметь свой публичный получить набор функций, затем иметь защищенную пару функций setHealth, getHealth. Вы можете изменить его, если хотите, но ключевым моментом является то, что у вас есть один набор методов для доступа с публичной привилегией, а другой - для доступа с защищенной привилегией.

3 голосов
/ 09 сентября 2011

Поскольку вы будете обновлять _health только из своего класса Mob, вы можете написать приватную функцию для его установки.

private function setHealth(value:Number):void
{
    _health = value;
}

И держи публичного добытчика как такового.

0 голосов
/ 09 сентября 2011

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

internal var _health:Number;
public function get health():Number { return _health; }
internal function set health(value:Number):void { _health = value; }
...