2009-12-15 2 views
0

У меня есть затемнение. Я думал, что понял эти принципы, но я не могу больше работать. Я хочу, чтобы DeleteButton наследовал от общего класса Button. Этот DeleteButton должен изменять защищенные значения дополнений и иметь статическую метку. Это то, что у меня есть:AS3: переопределение защищенного var в подклассу

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 по-прежнему сконструирован со значениями по умолчанию для суперкласса. Я не могу понять, как это сделать. Что мне здесь не хватает?

Заранее спасибо.

Edit:

Я предполагаю, что у меня была реализация AS3 смешивается с РНР. Этот «эквивалентный» пример в 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; 

... перед вызовом 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. –

3

Я думаю, называя супер («х») перед установкой _paddingX и _paddingY может сделать разницу:

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

     _paddingX = 5; 
     _paddingY = 2; 
    } 
+0

, и если это само по себе не делает трюк, назначьте значения прописным vars в конструкторе класса Button вместо того, чтобы делать это вместе со своими объявлениями переменных. – Amarghosh

+0

Оба предложения не работают, я боюсь. Что касается предложения Франкермеса: это имеет смысл, потому что мне нужны значения, измененные до того, как они будут использоваться в конструкторе supers. –

+0

Вы хотите использовать переменные значения перед выполнением конструктора суперкласса? рассмотрите вопрос о перепроектировании. – Amarghosh

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 в приватный, чтобы скрыть их от реализации и добавить новый _paddingX/Y в DeleteButton. Однако это похоже на грязную практику, поскольку свойства в DeleteButton не применяются API.

Смежные вопросы