AS3:覆盖子类中的受保护var

时间:2009-12-15 10:38:40

标签: actionscript-3 override protected

我在这里停电。我以为我理解了这些原则,但我似乎无法让它工作了。我想让DeleteButton继承一般的Button类。此DeleteButton应更改受保护的填充值并具有静态标签。这就是我所拥有的:

public class Button
{
    private var _labelText:String;

    protected var _paddingX:Number = 10;
    protected var _paddingY:Number = 5;

    public function Button( labelText:String ):void
    {
        _labelText = labelText;
    }
}

public class DeleteButton extends Button
{
    public function DeleteButton():void
    {
        _paddingX = 5;
        _paddingY = 2;

        super( 'x' );
    }
}

现在,我认为继承类中改变的_paddingX和_paddingY值会冒泡到超类。但他们没有。 DeleteButton仍然使用超类的默认值构造。我不知道怎么做了。我在这里缺少什么?

提前致谢。

修改

我想我的AS3实现与PHP混合了。 PHP中的这个“等效”示例完全合法:

class Button
{

    protected $_paddingX = 10;
    protected $_paddingY = 5;

    public function __construct( $label = '' )
    {
        var_dump( $label . ':' );
        var_dump( $this->_paddingX );
        var_dump( $this->_paddingY );
        echo '<br>';
    }
}

class DeleteButton extends Button
{
    public function __construct()
    {
        $this->_paddingX = 5;
        $this->_paddingY = 2;

        parent::__construct( 'x' );
    }
}

$button = new Button( 'browse' );
$deleteButton = new DeleteButton();

// this outputs:
string(7) "browse:" int(10) int(5) 
string(2) "x:" int(5) int(2)

3 个答案:

答案 0 :(得分:4)

当你调用super()函数时,你也初始化了所有的超类变量。所以在你打电话的例子中......

_paddingX = 5;
_paddingY = 2;

..在调用super()之前,实际上是在该函数中创建任意值。所以你只是在调用super()函数之前不会存在这些变量。

public class Button
{
    private var _labelText:String;

    protected var _paddingX:Number;
    protected var _paddingY:Number;

    public function Button( labelText:String, paddingX:Number=10, paddingY:Number=5 ):void
    {
        _paddingX = paddingX;
        _paddingY = paddingY;

        _labelText = labelText;
    }
    public function traceVars():void {
        trace(_labelText);
        trace(_paddingX);
        trace(_paddingY);
    }
}

public class DeleteButton extends Button
{
    public function DeleteButton():void
    {
        super( 'x', 5, 2 );

    }
}

这样做,这样你可以保留默认值,如10和5,但如果需要,可以更改它们。现在如果你在主时间轴上调用它,它应该适合你。

var but:DeleteButton = new DeleteButton();
but.traceVars();

希望这能解释它:)

乔治

答案 1 :(得分:3)

我认为在设置_paddingX和_paddingY之前调用super('x')可能会有所不同:

 public function DeleteButton():void
    {
        super( 'x' );

        _paddingX = 5;
        _paddingY = 2;
    }

答案 2 :(得分:0)

你可以做的是覆盖getter:

public class Button
{
    private var _labelText:String;

    protected var _paddingX:Number = 10;
    protected var _paddingY:Number = 5;

    public function Button( labelText:String ):void
    {
        _labelText = labelText;
    }

    protected function get paddingX():Number
    {
        return _paddingX;
    }
    // get paddingY ommited for brevity
}

public class DeleteButton extends Button
{
    public function DeleteButton():void
    {
        super( 'x' );
    }

    override protected function get paddingX():Number
    {
        return 42;
    }
}

父Button构造函数现在将使用子DeleteButton类重写的getter。

您还可以将_paddingX / Y设置为private以将其隐藏在实现中,并在DeleteButton中添加新的_paddingX / Y.然而,这似乎是一种肮脏的做法,因为DeleteButton中的属性不是由API强制执行的。