Apache flex 是否可以在不继承类的情况下向非动态ActionScript 3类添加行为?
我想做的事情如下:Apache flex 是否可以在不继承类的情况下向非动态ActionScript 3类添加行为?,apache-flex,actionscript-3,extension-methods,Apache Flex,Actionscript 3,Extension Methods,我想做的事情如下: FooClass.prototype.method = function():String { return "Something"; } var foo:FooClass = new FooClass(); foo.method(); 也就是说,我想用一个方法扩展生成的类,不是通过继承而是通过原型 该类是从WSDL生成的,它不是一个动态类,我不想接触生成的代码,因为它无论如何都会被覆盖 长话短说,我想为AS3提供C#3:s扩展方法的道德等价物 编辑:我接受了ai
FooClass.prototype.method = function():String
{
return "Something";
}
var foo:FooClass = new FooClass();
foo.method();
也就是说,我想用一个方法扩展生成的类,不是通过继承而是通过原型
该类是从WSDL生成的,它不是一个动态类,我不想接触生成的代码,因为它无论如何都会被覆盖
长话短说,我想为AS3提供C#3:s扩展方法的道德等价物
编辑:我接受了aib的答案,因为它最符合我的要求——尽管经过进一步思考,它并不能真正解决我的问题,但这是我问错问题的错。:)此外,upmods还提供了一些好的建议。是的,这样的事情是可能的 事实上,您的示例与解决方案非常接近 试一试 而不是
foo.method();
@不幸的是,aib是不正确的。假设采用严格模式(默认编译器模式),则不可能在ActionScript 3中修改非动态类类型的原型。我甚至不确定它在非严格模式下是否可行 包装是一种选择吗?基本上,您创建一个类,该类接受从web服务获得的一个对象,并将所有方法调用转发给该对象,但也有自己的方法:
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
类,但除非您可以修改生成的代码以包含所需的方法或使类成为动态的,否则我看不出该如何操作
另一个解决方案是在构建过程中添加一个步骤,修改生成类的源。我假设您已经有了一个从WSDL生成代码的步骤,所以您可以做的是在该步骤之后添加一个步骤,插入您需要的方法。@Theo:您如何解释在3.0.0.477中使用默认的flex-config.xml(true)甚至是传递给mxmlc的-compiler.strict参数进行以下操作 Foo.as:
package
{
public class Foo
{
public var foo:String;
public function Foo()
{
foo = "foo!";
}
}
}
例如:
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"]());
}
}
}
请注意,OP表示继承是不可接受的,修改生成的代码也是不可接受的。(如果不是这样,那么在类定义中添加“dynamic”可能是最简单的解决方案。)根据您的类有多少方法,这可能会起作用: 实际等级:
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();
猴子修补是一种(不雅观的)选择
例如,假设您不喜欢Flex 3 spriteaset.as返回默认边界度量[7,7,7,7](与Flex 2不同)。要解决此问题,您可以:
谷歌“”获取更多示例和说明。@aib是对的,我在测试时犯了一个错误。我忘记了原型只能在类上访问,而不能在每个对象上访问,所以我遇到了运行时错误。然而,我的包装解决方案不是子类化,而是包装。包装器类仅扩展原始类,使其具有相同的类型。
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();