É possível adicionar um comportamento a um não-dinâmica de classe ActionScript 3 sem herdar a classe?

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

Pergunta

O que eu gostaria de fazer é algo como o seguinte:

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

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

O que é dizer, eu gostaria de estender uma classe gerada com um único método, e não através de herança, mas através do protótipo.

A classe é gerada a partir de um WSDL, não é uma dinâmica de classe, e eu não quero tocar, o código gerado porque ele será substituído qualquer maneira.

Longa história curta, eu gostaria de ter o equivalente moral de C# 3:s Métodos de Extensão para AS3.

Editar:Eu aceito aib resposta, porque ele se encaixa com o que eu estava perguntando melhor, apesar de que após uma reflexão, isso não é realmente resolver o meu problema, mas essa é a minha culpa, fazendo a pergunta errada.:) Também, upmods para as boas sugestões.

Foi útil?

Solução

Sim, tal coisa é possível.

Na verdade, o seu exemplo é muito próximos da solução.

Tente

foo["method"]();

em vez de

foo.method();

Outras dicas

@Theo:Como você explicaria o seguinte trabalho em 3.0.0.477 com o padrão flex-config.xml (<strict>verdadeiro</strict>) e até mesmo um compilador.estrito parâmetro passado para mxmlc?

Foo.como:

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

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

footest.como:

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

Observe que o OP disse herança era inaceitável, como foi modificando o código gerado.(Se isso não fosse o caso, a adição de "dinâmico" para a definição de classe seria, provavelmente, a solução mais fácil.)

Dependendo de quantos métodos de sua classe tem, isto pode funcionar:

Classe Real:

public class SampleClass
{
    public function SampleClass()
    {
    }

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

Rápido 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, infelizmente, é incorreto.Assumindo de modo estrito (o compilador padrão do modo) não é possível modificar o protótipo de não-dinâmica de tipos de classe em ActionScript 3.Nem sequer tenho a certeza de que é possível não de modo estrito.

É a moldagem de uma opção?Basicamente, você cria uma classe que leva um dos objetos que você começar a partir do web service e apenas encaminha todas as chamadas de método para o que, mas também tem métodos da própria:

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

}

Quando você deseja trabalhar com um Foo, mas também tem o método extra que você precisa moldar a Foo instância, em uma FooWrapper e o trabalho com que os objetos em vez.

Não é a solução mais conveniente, há um monte de digitação e se o código gerado alterações para alterar o FooWrapper classe pela mão, mas a menos que você pode modificar o código gerado para incluir o método que você deseja ou para tornar a aula dinâmica, eu não vejo como isso pode ser feito.

Outra solução é adicionar uma etapa de seu processo de criação, que modifica a fonte das classes geradas.Eu suponho que você já tem uma etapa que gera o código a partir de um WSDL, então, o que você pode fazer é adicionar um passo depois que insere os métodos que você precisa.

Monkey patching é uma elegante opção.

Por exemplo, suponha que você não gosta do fato de que o Flex 3 SpriteAsset.como devolve uma borda padrão de métricas de [7,7,7,7] (ao contrário de flex 2).Para corrigir isso, você pode:

  1. Criar uma cópia de SpriteAsset.como e adicioná-lo ao seu projeto a /mx/core/SpriteAsset.como
  2. Editar a sua cópia local para corrigir quaisquer problemas que você encontrar
  3. Executar o seu ap

Google "flex monkey patch"para mais instruções e exemplos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top