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クラスからオーバーライドされたゲッターを使用するようになります。

_paddingX / Yをprivateに設定して実装から非表示にし、DeleteButtonに新しい_paddingX/Yを追加することもできます。ただし、DeleteButtonのプロパティはAPIによって強制されないため、これは汚い習慣のように思われます。

于 2012-12-18T10:13:09.947 に答える