هل من الممكن إضافة سلوك إلى فئة ActionScript 3 غير ديناميكية دون وراثة الفئة؟

StackOverflow https://stackoverflow.com/questions/7212

سؤال

ما أود القيام به هو شيء مثل ما يلي:

FooClass.prototype.method = function():String
{
    return "Something";
}

var foo:FooClass = new FooClass();
foo.method();

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

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

باختصار، أود الحصول على المعادل الأخلاقي لطرق تمديد C# 3:s لـ AS3.

يحرر:لقد قبلت إجابة aib، لأنها تناسب ما كنت أطرحه بشكل أفضل - على الرغم من أنه بعد مزيد من التفكير لا يحل مشكلتي حقًا، ولكن هذا خطأي لأنني طرحت السؤال الخطأ.:) أيضا، upmods للاقتراحات الجيدة.

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

المحلول

نعم، شيء من هذا القبيل ممكن.

في الواقع، مثالك قريب جدًا من الحل.

يحاول

foo["method"]();

بدلاً من

foo.method();

نصائح أخرى

@ثيو:كيف تفسر العمل التالي في الإصدار 3.0.0.477 باستخدام الإعداد الافتراضي flex-config.xml (<strict>true</strict>) وحتى المعلمة -compiler.strict التي تم تمريرها إلى mxmlc؟

فوو.اس:

package
{
    public class Foo
    {
        public var foo:String;

        public function Foo()
        {
            foo = "foo!";
        }
    }
}

footest.as:

package
{
    import flash.display.Sprite;

    public class footest extends Sprite
    {
        public function footest()
        {
            Foo.prototype.method = function():String
            {
                return "Something";
            }

            var foo:Foo = new Foo();
            trace(foo["method"]());
        }
    }
}

لاحظ أن البروتوكول الاختياري قال إن الميراث غير مقبول، كما هو الحال مع تعديل الكود الذي تم إنشاؤه.(إذا لم يكن الأمر كذلك، فمن المحتمل أن تكون إضافة كلمة "ديناميكي" إلى تعريف الفئة هو الحل الأسهل.)

اعتمادًا على عدد الطرق التي يستخدمها فصلك، قد ينجح هذا:

الفئة الفعلية:

public class SampleClass
{
    public function SampleClass()
    {
    }

    public function method1():void {
        Alert.show("Hi");
    }

المجمع السريع:

var actualClass:SampleClass = new SampleClass();

var QuickWrapper:Object = {
    ref: actualClass,
    method1: function():void {
        this.ref.method1();
    },
    method2: function():void {
        Alert.show("Hello!");
    }   
};

QuickWrapper.method1();
QuickWrapper.method2();

@aib غير صحيح للأسف.بافتراض الوضع الصارم (وضع المترجم الافتراضي) فإنه ليس من الممكن تعديل النموذج الأولي لأنواع الفئات غير الديناميكية في ActionScript 3.لست متأكدًا حتى من إمكانية ذلك في الوضع غير الصارم.

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

public class FooWrapper extends Foo {

    private var wrappedFoo : Foo;

    public function FooWrapper( foo : Foo ) {
        wrappedFoo = foo;
    }

    override public function methodFromFoo( ) : void {
        wrappedFoo.methodFromFoo();
    }

    override public function anotherMethodFromFoo( ) : void {
        wrappedFoo.anotherMethodFromFoo();
    }

    public function newMethodNotOnFoo( ) : String {
        return "Hello world!"
    }

}

عندما تريد العمل مع أ Foo, ، ولكن لديك أيضًا الطريقة الإضافية التي تحتاجها لتغليف ملف Foo المثال في أ FooWrapper والعمل مع هذا الكائن بدلا من ذلك.

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

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

يعد ترقيع القرد خيارًا (غير أنيق).

على سبيل المثال، لنفترض أنك لا تحب حقيقة أن Flex 3 SpriteAsset.as يُرجع مقاييس حدود افتراضية تبلغ [7,7,7,7] (على عكس flex 2).لإصلاح ذلك، يمكنك:

  1. أنشئ نسخة من SpriteAsset.as وأضفها إلى مشروعك على /mx/core/SpriteAsset.as
  2. قم بتحرير نسختك المحلية لإصلاح أي مشاكل تجدها
  3. قم بتشغيل التطبيق الخاص بك

جوجل "رقعة قرد مرنة" لمزيد من الأمثلة والتعليمات.

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