Actionscript 3 AS3:重写子类中的受保护变量

Actionscript 3 AS3:重写子类中的受保护变量,actionscript-3,overriding,protected,Actionscript 3,Overriding,Protected,我这里停电了。我以为我理解这些原则,但我似乎无法让它继续工作了。我想让DeleteButton从常规Button类继承。此DeleteButton应更改受保护的填充值,并具有静态标签。这就是我所拥有的: public class Button { private var _labelText:String; protected var _paddingX:Number = 10; protected var _paddingY:Number = 5; publ

我这里停电了。我以为我理解这些原则,但我似乎无法让它继续工作了。我想让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)
class按钮
{
受保护的$_paddingX=10;
受保护的$_paddingY=5;
公共函数构造($label='')
{
变量转储($label.:');
变量转储($this->\u paddingX);
var_dump($this->_paddingY);
回声“
”; } } 类DeleteButton扩展按钮 { 公共函数构造() { $this->_paddingX=5; $this->_paddingY=2; 父项::_构造('x'); } } $button=新按钮(“浏览”); $deleteButton=新建deleteButton(); //这将产生: 字符串(7)“浏览:”整数(10)整数(5) 字符串(2)“x:”int(5)int(2)
我认为在设置_paddingX和_paddingY之前调用super('x')可能会有所不同:

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

        _paddingX = 5;
        _paddingY = 2;
    }
调用super()函数时,还需要初始化所有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();
希望这能解释它:)


George

您可以做的是覆盖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;
    }
}
父按钮构造函数现在将使用子DeleteButton类中被重写的getter


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

如果这一点本身不起作用,那么将值分配给Button类构造函数中的填充变量,而不是与它们的变量声明一起执行。恐怕您的两个建议都不起作用。至于frankhermes的建议:这是有意义的,因为在超级类的构造函数中使用这些值之前,我需要对它们进行修改?考虑重新设计。嗯,我刚刚在PHP中创建了我的例子,我想我已经把AS3的实现与PHP的工作混在一起了。因为在PHP中,我的示例是完全合法的,并且按照我的预期工作。谢谢。这实际上是我一开始实现它的方式,但我希望可以绕过按钮构造函数的附加参数。