¿Es posible agregar comportamiento a una clase ActionScript 3 no dinámica sin heredar la clase?

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

Pregunta

Lo que me gustaría hacer es algo como lo siguiente:

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

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

Es decir, me gustaría ampliar una clase generada con un único método, no mediante herencia sino mediante el prototipo.

La clase se genera a partir de un WSDL, no es una clase dinámica y no quiero tocar el código generado porque de todos modos se sobrescribirá.

En pocas palabras, me gustaría tener el equivalente moral de los métodos de extensión de C# 3 para AS3.

Editar:Acepté la respuesta de aib porque se ajusta mejor a lo que estaba preguntando, aunque tras reflexionar más, realmente no resuelve mi problema, pero es mi culpa por hacer la pregunta equivocada.:) Además, actualizaciones por las buenas sugerencias.

¿Fue útil?

Solución

Sí, tal cosa es posible.

De hecho, su ejemplo está muy cerca de la solución.

Intentar

foo["method"]();

en lugar de

foo.method();

Otros consejos

@Teo:¿Cómo explicaría lo siguiente trabajando en 3.0.0.477 con el flex-config.xml predeterminado (<strict>true</strict>) e incluso un parámetro -compiler.strict pasado a mxmlc?

Foo.as:

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

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

reposapiés.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"]());
        }
    }
}

Tenga en cuenta que el OP dijo que la herencia era inaceptable, al igual que la modificación del código generado.(Si ese no fuera el caso, agregar "dinámico" a la definición de clase probablemente sería la solución más sencilla).

Dependiendo de cuántos métodos tenga tu clase, esto puede funcionar:

Clase real:

public class SampleClass
{
    public function SampleClass()
    {
    }

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

Envoltorio rápido:

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();

Desafortunadamente, @aib es incorrecto.Suponiendo el modo estricto (el modo de compilación predeterminado), no es posible modificar el prototipo de tipos de clases no dinámicas en ActionScript 3.Ni siquiera estoy seguro de que sea posible en modo no estricto.

¿Envolver es una opción?Básicamente, creas una clase que toma uno de los objetos que obtienes del servicio web y simplemente reenvía todas las llamadas a ese método, pero también tiene sus propios métodos:

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

}

Cuando quieres trabajar con un Foo, pero también tiene el método adicional que necesita para envolver el Foo instancia en un FooWrapper y trabajar con ese objeto en su lugar.

No es la solución más conveniente, hay que escribir mucho y si el código generado cambia hay que cambiar el FooWrapper clase a mano, pero a menos que pueda modificar el código generado para incluir el método que desea o para hacer que la clase sea dinámica, no veo cómo se puede hacer.

Otra solución es agregar un paso a su proceso de compilación que modifique el código fuente de las clases generadas.Supongo que ya tienes un paso que genera el código a partir de un WSDL, así que lo que podrías hacer es agregar un paso después que inserte los métodos que necesitas.

Parchar monos es una opción (poco elegante).

Por ejemplo, supongamos que no le gusta el hecho de que Flex 3 SpriteAsset.as devuelva una métrica de borde predeterminada de [7,7,7,7] (a diferencia de flex 2).Para solucionar este problema, puedes:

  1. Cree una copia de SpriteAsset.as y agréguela a su proyecto en /mx/core/SpriteAsset.as
  2. Edite su copia local para solucionar cualquier problema que encuentre
  3. Ejecute su aplicación

Google "parche de mono flexible" para obtener más ejemplos e instrucciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top