سؤال

أواجه تعتيم هنا. اعتقدت أنني فهمت هذه المبادئ، لكنني لا يبدو لي أن أعملها بعد الآن. أريد أن أترك حذفبوتن يرث من فئة زر عام. يجب أن يغير هذا 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 و _PADDONY في الفئة الموروثة ستؤدي إلى فقاعة تصل إلى الطبقة الفائقة. لكنهم لا يفعلون ذلك. لا يزال 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)
هل كانت مفيدة؟

المحلول

عند استدعاء الدالة Super ()، قمت أيضا بتهيئة جميع متغيرات الفئات الفائقة. لذلك في مثالك عند الاتصال ..

_paddingX = 5;
_paddingY = 2;

.. قبل أن تدعو سوبر ()، أنت فعلا إنشاء قيم تعسفية داخل هذه الوظيفة. لذلك أنت تحصل عليه بشكل صحيح لها فقط أن هذه المتغيرات لا توجد حتى يتم استدعاء وظيفة 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();

آمل أن يفسر هذا :)

جورج

نصائح أخرى

أعتقد أن استدعاء Super ('x') قبل تعيين _paddingx و _Paddingy قد تحدث فرقا:

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

        _paddingX = 5;
        _paddingY = 2;
    }

ما يمكن القيام به هو تجاوز الأجيوت:

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

سيستخدم Microsoft Palty Button Instructor الآن Getter Getter من Child Deletebutton Class.

يمكنك أيضا تعيين _Paddingx / y إلى خاص لإخفائها من التنفيذ، وإضافة جديد _Paddingx / y في Deletebutton. ومع ذلك، يبدو ذلك مثل ممارسة قذرة، لأن الخصائص في Deletebutton لا يتم تطبيقها بواسطة API.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top