ActionScript - 只读属性和私有集方法?

时间:2011-03-28 22:29:00

标签: actionscript-3 private getter-setter

我从未真正了解AS3的一件事是你不能拥有私有集方法和公共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关键字?

4 个答案:

答案 0 :(得分:4)

MXML编译器不支持具有混合范围/命名空间的getter和setter。有几张关于此的门票:

这很烦人,但至少Adobe意识到了这一点。有一种方法可以通过使用自定义命名空间和对getter或setter的完全限定引用来完成混合命名空间getter和setter。

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;
       }
    }
  }
}

答案 1 :(得分:0)

是否有原因

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

不起作用?它给出了什么错误?我在Flex中一直这样做,所以我不确定它是否只在那里工作......但我不这么认为。

编辑:看起来这是一个编译器错误。这是一篇包含解决方案http://blogagic.com/230/struggling-with-flex-error-1000-ambiguous-reference-to

的博客文章

答案 2 :(得分:0)

不理想,但你能创建一个私有方法吗?

答案 3 :(得分:0)

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

不,如果一个人是私人的,他们都必须是私人的。不管其他人认为这不是一个错误
setter / getters背后的想法是隔离代码 public 。 记住这个OOP
您还应该尝试使用前导_

来保持var名称的典型约定
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;
  }


refer
The so called bug report is here