views:

832

answers:

2

Hi all,

I'm having a blackout here. I thought I understood these principles, but I can't seem to get it working anymore. I want to let a DeleteButton inherit from a general Button class. This DeleteButton should alter the protected padding values and have a static label. This is what I have:

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

Now, I thought the altered _paddingX and _paddingY values in the inherited class would bubble up to the super class. But they don't. The DeleteButton is still constructed with the default values of the super class. I can't figure out how to do it anymore. What am I missing here?

Thanks in advance.

Edit:

I guess I had AS3's implementation mixed up with PHP's. This 'equivalent' example in PHP is perfectly legal:

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)
+2  A: 

I think calling super('x') before setting the _paddingX and _paddingY could make a difference:

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

        _paddingX = 5;
        _paddingY = 2;
    }
frankhermes
and if this alone doesn't do the trick, assign values to the padding vars in the constructor of Button class instead of doing it along with their variable declarations.
Amarghosh
Both your suggestions don't work, I'm afraid. As for frankhermes' suggestion: this makes sense, because I need the values altered before they are used in the supers constructor.
fireeyedboy
you wanna use variable values before super class's constructor is executed? consider redesigning.
Amarghosh
Hmmm, I just created my example in PHP also and I think I had AS3's implementationt mixed up with the workings of PHP. Because in PHP my example is perfectly legal and works as I expect it to work.
fireeyedboy
+2  A: 

Hi, when you call the super() function you also initialise all of the super classes variables. So in your example when you call..

_paddingX = 5;
_paddingY = 2;

..before calling super(), you are actually creating arbitrary values inside that function. So you're getting it right its just that those variables dont exist until the super() function has been called.

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

 }
}

Do this instead, this way you can keep the default values, as 10 and 5, but change them if needed. Now if you call this on the main timeline you it should work for you.

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

Hope this explains it :)

George

supercrabtree
Thanks supercrabtree. This is actually how I had it implemented in the first place, but I was hoping I could circumvent the additional parameters for the Button's constructor.
fireeyedboy