سؤال

سؤالي يتعلق بأفضل الممارسات للوصول إلى أصل الكائن التابع.لنفترض أن أحد الفصول يقوم بإنشاء مثيل لفئة أخرى، ويتم الآن الإشارة إلى مثيل الفئة هذا بكائن.من هذا الكائن الفرعي، ما هي أفضل طريقة للرجوع إلى الكائن الأصلي؟أعرف حاليًا طريقتين أستخدمهما كثيرًا، ولكني لست متأكدًا مما إذا كانت أ) هناك طريقة أفضل للقيام بذلك أو ب) أي منهما هي الممارسة الأفضل

الطريقة الأولى هي استخدام getDefinitionByName، الذي لن يؤدي إلى إنشاء مثيل لهذه الفئة، ولكنه يسمح بالوصول إلى أي شيء بداخلها تم الإعلان عنه علنًا.

_class:Class = getDefinitionByName("com.site.Class") as Class;

ثم قم بالإشارة إلى هذا المتغير بناءً على التسلسل الهرمي من الأصل إلى التابع.
على سبيل المثال، إذا كان الطفل يحاول الإشارة إلى فصل دراسي أعلى منه بمستويين:

_class(parent.parent).function();

يبدو أن هذا يعمل بشكل جيد، ولكن يجب عليك معرفة المستوى الذي وصل إليه الطفل مقارنة بمستوى الوالد الذي تحاول الوصول إليه.

يمكنني أيضًا الحصول على العبارة التالية لتتبع [object ClassName] في مخرجات Flash.

trace(Class);

أنا لست متأكدًا بنسبة 100% من تنفيذ هذا السطر، ولم أتبعه كوسيلة للإشارة إلى كائن خارج الكائن الحالي الذي أنا فيه.

هناك طريقة أخرى رأيتها مستخدمة وهي ببساطة تمرير مرجع إلى هذا إلى كائن الفئة الذي تقوم بإنشائه والتقاطه باستخدام وسيطة منشئة

var class:Class = new Class(this);  

ثم في ملف الفصل

public function Class(objectRef:Object) {
    _parentRef = objectRef;
} 

يتطلب هذا المرجع أيضًا الرجوع إلى الخلف باستخدام التسلسل الهرمي للطفل إلى الأصل.

يمكنني أيضًا استيراد تلك الفئة، ثم استخدام مسار الملف المباشر للإشارة إلى طريقة داخل تلك الفئة، بغض النظر عن الأصل أم لا.

import com.site.Class;
com.site.Class.method();

بالطبع هناك علاقة بين الوالدين والطفل غير ذات صلة لأنني أقوم بالوصول إلى الطريقة أو الخاصية مباشرة من خلال الفصل المستورد.

أشعر وكأنني أفتقد شيئًا واضحًا حقًا هنا.أنا أبحث بشكل أساسي عن تأكيد ما إذا كانت هذه هي الطرق الصحيحة للإشارة إلى الأصل، وإذا كان الأمر كذلك فما هي الطريقة الأكثر مثالية، أم أنني أبالغ في البحث عن شيء آخر؟

هل كانت مفيدة؟

المحلول

من الجيد عمومًا أن يكون لديك الفصل كمثال خاص به وتقليل الاقتران المحكم بشيء آخر (كما هو الحال في هذه الحالة، فهو الأصل).إذا قمت بشيء مثلparent.doSomething() فليس من الممكن استخدام تلك الفئة في حاوية لا تحتوي على طريقة doSometing().أعتقد أنه من الأفضل بالتأكيد اجتياز كل ما قد يحتاجه الفصل ومن ثم داخل الفصل لا يتعين عليه القيام بأي شيء من الوالدين أو الوالدين وما إلى ذلك بعد الآن.

مع هذا، إذا كنت تريد تغيير البنية في المستقبل، فمن السهل جدًا تمرير مرجع جديد؛لا يجب أن يتغير تنفيذ الفصل الفرعي على الإطلاق.

البديل الثالث الذي لديك هنا مختلف تمامًا أيضًا، فهو الوصول إلى طريقة ثابتة على مستوى الفصل (ليس عليك كتابة مسار الفصل بالكامل عند الوصول إلى تلك الطريقة)، وليس طريقة مثيل كما في الأولين.

نصائح أخرى

بشكل عام، إذا كنت تريد أن يتواصل الطفل مع أحد والديه، فعليك أن تنظر في جعله يفعل ذلك من خلال بث الأحداث.يؤدي هذا إلى فصل الطفل عن الوالد، ويجعل من الممكن جعل فصول أخرى تعمل مع الطفل.

لا أوصي بتمرير إشارة إلى الفصل الأصلي إلى الطفل.

إليك مثال بسيط (لقد قمت باختبار/تجميع هذا لذا قد يكون هناك بعض الأخطاء المطبعية).

//Child.as
package
{
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class Child extends EventDispatcher
    {
        public function doSomething():void
        {
            var e:Event = new Event(Event.COMPLETE);
            dispatchEvent(e);
        }

        public function foo():void
        {
            trace("foo");
        }
    }
}


//Parent.as
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    public class Parent extends Sprite
    {
        private var child:Child;
        public function Parent():void
        {
            c = new Child();
            c.addEventListener(Event.COMPLETE, onComplete);
            c.foo();//traces foo

            c.doSomething()
        }

        public function onComplete(e:Event):void
        {
            trace("Child broadcast Event.COMPLETE");
        }

    }
}

في معظم الحالات، يمكنك إرسال أحداث مخصصة وتمرير البيانات معهم.

أساسًا:

لدى الوالد إشارة إلى الطفل ويتواصل عبر استدعاءات الطريقة.ليس لدى الطفل إشارة إلى ولي الأمر، ويتواصل (إلى أي شخص) عبر إرسال الأحداث.

امل ان يساعد...

غرف مايك

Mesh@adobe.com

لقد استخدمت دائمًا طريقتك الثانية، حيث قمت بتمرير مؤشر إلى الكائن الأصلي إلى الكائن الفرعي وتخزين هذا المؤشر في متغير عضو في الفصل الفرعي.بالنسبة لي يبدو أن هذه هي أبسط طريقة للتواصل مع الوالدين.

أحب تمرير الأصل كواجهة (بحيث يمكن احتواء الفصل في أي أصل ينفذ تلك الواجهة) أو تنفيذ المرجع كمؤشر/مفوض حدث/وظيفة يمكن للوالد الارتباط به.

أحب إعداد فئة عامة للتعامل مع المراجع إلى الفئات التي يجب الوصول إليها بواسطة أي فئة أخرى، وليس بالضرورة الطفل.

تتكون الفئة العالمية ببساطة من حروف ثابتة ومحددات مثل:

private static const class:Class;

public static function setClass(_class:Class){
class = _class;
}
public static function getClass(void):Class{
return class;
}

والشيء الجميل في هذا هو أنه ليس عليك استيراد الفصل الذي تعيده من الفصل العالمي، فقط الطبقة العالمية نفسها.

تضيف الفئة التي تحتاج إلى الرجوع إليها نفسها إلى القائمة العامة.والشيء الرائع الآخر هو أنه يمكنك بسهولة إرسال الأحداث من هذا الموقع المركزي.

في معظم الأحيان، إذا كانت هناك حاجة إلى الرجوع إلى فصل دراسي بواسطة فئات فرعية أو أي فصل آخر، فإنني أفعل ذلك من خلال واجهة.

إذا كانت هذه الكائنات موجودة في DisplayList، فلديك المزيد من الخيارات.إذا كان لدي ParentClass وChildClass، في الفصل الفرعي، يبدو أنك قادر على الوصول إلى الأصل إذا قدمت الطلب باعتباره ParentClass.على سبيل المثال

ParentClass(parent).parentFunction();

أعلم بالتأكيد أنه يعمل إذا كان ParentClass هو فئة المستند.نظرًا لأن فئة المستند تكون دائمًا العنصر الأول في قائمة العرض، فإن هذا يعمل:

ParentClass(stage.getChildAt(0)).parentFunction();

في حالتي، كانا كلاهما عضوين في نفس الحزمة، لذلك لم أكن بحاجة حتى إلى استيراد أي شيء.لم أختبره في جميع الظروف، لكنه نجح عندما كنت في حاجة إليه.

بالطبع، لا يعمل "parent" و"getChild..." إلا إذا كانت هذه الكائنات موجودة في DisplayList، ولكن هذا كان جيدًا بما فيه الكفاية بالنسبة لي.

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