Is dit moontlik om gedrag na 'n nie-dinamiese Action 3 klas by te voeg sonder erfgename van die klas?

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

Vra

Wat ek wil doen, is iets soos die volgende:

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

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

Dit is om te sê, wil ek graag 'n gegenereerde klas uit te brei met 'n enkele metode, nie via erfenis, maar via die prototipe.

Die klas word gegenereer uit 'n WSDL, dit is nie 'n dinamiese klas, en ek wil nie die gegenereerde kode raak omdat dit in elk geval sal oorskryf.

Lang storie kort, ek wil die morele ekwivalent van C # 3 het:. S Uitbreiding Metodes vir AS3

Edit: Ek aanvaar antwoord AIB se, want dit pas wat ek was die beste vra - hoewel op verdere besinning dit nie regtig my probleem op te los, maar dit is my skuld vir vra die verkeerde vraag. :) Ook, upmods vir die goeie voorstelle.

Was dit nuttig?

Oplossing

Ja, so 'n ding is moontlik.

In werklikheid, jou voorbeeld is baie naby aan die oplossing.

Probeer

foo["method"]();

in plaas van

foo.method();

Ander wenke

@Theo: Hoe sou jy die volgende werk in 3.0.0.477 verduidelik met die verstek flex-config.xml ( true ) en selfs 'n -compiler.strict parameter geslaag om mxmlc

Foo.as:

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"]());
        }
    }
}

Let daarop dat die OP het gesê erfenis is onaanvaarbaar, as die gegenereerde kode is verander. (As dit was nie die geval is, en bygevoeg "dinamiese" aan die klas definisie waarskynlik die maklikste oplossing sou wees.)

Afhangende van hoeveel metodes jou klas het, dit kan werk:

Werklike Klas:

public class SampleClass
{
    public function SampleClass()
    {
    }

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

Quick wrapper:

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 is ongelukkig verkeerd. Veronderstelling streng af (die verstek samesteller af) is dit nie moontlik om die prototipe van nie-dinamiese tipes klas in Action 3. verander ek is nie eens seker dat dit moontlik is in 'n nie-streng af.

Is wikkel 'n opsie? Basies wat jy maak 'n klas wat een van die voorwerpe wat jy kry van die web diens en net vorentoe al metode oproepe na daardie neem, maar het ook metodes van sy eie:

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!"
    }

}

As jy wil om te werk met 'n Foo, maar ook die ekstra metode wat jy nodig het jy draai die Foo byvoorbeeld in 'n FooWrapper en werk met daardie voorwerp in plaas.

Dit is nie die mees geskikte oplossing, daar is 'n baie tik en indien die gegenereerde kode verander jy die FooWrapper klas met die hand te verander, maar tensy jy die gegenereerde kode óf kan verander na die metode wat jy wil insluit of die maak klas dinamiese Ek kan nie sien hoe dit gedoen kan word.

'n Ander oplossing is om 'n stap te voeg aan jou bou proses wat die bron van die gegenereerde klasse verander. Ek neem aan dat jy reeds 'n stap wat die kode genereer uit 'n WSDL, so wat jy kan doen, is om 'n stap daarna dat die metodes wat jy nodig voeg by te voeg.

aap lap is 'n (onelegant) opsie.

Byvoorbeeld, veronderstel jy hou nie van die feit dat Flex 3 SpriteAsset.as terug 'n standaard grens statistieke van [7,7,7,7] (in teenstelling met flex 2). Om dit op te los, kan jy:

  1. Skep 'n afskrif van SpriteAsset.as en voeg dit by jou projek by /mx/core/SpriteAsset.as
  2. Wysig jou plaaslike kopie aan enige probleme op te los wat jy vind
  3. Begin jou AP

Google " flex aap kol " vir meer voorbeelde en opdragte .

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top