用set覆盖公共变量

时间:2011-10-17 18:21:13

标签: actionscript-3

我有一个像这样的基类

class Base {
    public var space:Number;
}

扩展
class Desc extends Base {

    override public function set space( space:Number ):void {
        //code
    } 

}

这不编译。说,你没有对基类的控制,有什么方法可以实现同样的东西?

显而易见的是创建一个函数setSpace(),但是这个对象嵌入在使用public space的现有系统中。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的基类应该以这样的方式定义:

class Base {

    // Don't use public variables. Make them private and define setters and getters 
    private var space_:Number;

    public function get space():Number {
        return space_;
    }

    public function set space(v:Number):void {
        if (space_ === v) return;
        space_ = v;
    }

}

然后可以用这种方式覆盖:

class Desc extends Base {

    override public function set space( space:Number ):void {
        //code
    } 

}

修改

我错过了你说你无法控制基类的部分。在这种情况下,希望将space定义为getter / setter(如果该类正确实现,则应该如此)。如果没有,您确实必须使用getSpacesetSpace等功能。

答案 1 :(得分:3)

来自Adobe

  

使用var关键字声明的类成员变量不能   在子类中重写。

在您的情况下,使用setter不是一个选项。如果需要保留接口,请使用组合而不是继承:

class Desc {

  private var _base:Base;

  public function set space(space:Number):void {
    //code
    this._base.space = space;
  } 
}