É possível adicionar um comportamento a um não-dinâmica de classe ActionScript 3 sem herdar a classe?
-
08-06-2019 - |
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.
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:
- Criar uma cópia de SpriteAsset.como e adicioná-lo ao seu projeto a /mx/core/SpriteAsset.como
- Editar a sua cópia local para corrigir quaisquer problemas que você encontrar
- Executar o seu ap
Google "flex monkey patch"para mais instruções e exemplos.