2009-12-15 74 views
0

我在這裏停電。我認爲我理解了這些原則,但我似乎無法再使用它了。我想讓一個DeleteButton從一個普通的Button類繼承。這個DeleteButton應該改變受保護的填充值並且有一個靜態標籤。這是我有:AS3:在子類中重寫受保護的變量

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

當你調用超()函數你也初始化所有的超類變量。所以在你的例子中,當你打電話給你..

_paddingX = 5; 
_paddingY = 2; 

..before調用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(); 

希望這解釋了吧:)

喬治

+0

謝謝supercrabtree。這實際上是我首先實現的,但我希望能繞過Button的構造函數的其他參數。 – 2009-12-15 12:51:28

3

我想調用設置_paddingX和_paddingY之前超(「X」)可以有所作爲:

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

     _paddingX = 5; 
     _paddingY = 2; 
    } 
+0

如果這本身並沒有這個訣竅,則將值分配給Button類的構造函數中的填充變量,而不是與它們的變量聲明一起執行。 – Amarghosh 2009-12-15 10:47:54

+0

恐怕你的建議都不起作用。至於frankhermes的建議:這是有道理的,因爲我需要在超級構造函數中使用它們之前更改這些值。 – 2009-12-15 11:11:22

+0

你想在超類的構造函數執行前使用變量值嗎?考慮重新設計。 – Amarghosh 2009-12-15 12:28:26

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

的母按鈕構造現在將使用從孩子重寫的吸氣劑DeleteButton類。

您還可以將_paddingX/Y設置爲隱藏,以將其隱藏到實施中,並在DeleteButton中添加新的_paddingX/Y。但是,這看起來很髒,因爲DeleteButton中的屬性不是由API實施的。