0

我这里停电了。我以为我理解了这些原则,但我似乎无法再让它发挥作用了。我想让 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)
4

3 回答 3

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();

希望这能解释它:)

乔治

于 2009-12-15T12:07:48.863 回答
3

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

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

        _paddingX = 5;
        _paddingY = 2;
    }
于 2009-12-15T10:44:24.923 回答
0

你可以做的是覆盖吸气剂:

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 设置为私有以将它们从实现中隐藏,并在 DeleteButton 中添加新的 _paddingX/Y。然而,这似乎是一种肮脏的做法,因为 DeleteButton 中的属性不是由 API 强制执行的。

于 2012-12-18T10:13:09.947 回答