Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 是否可以在不继承类的情况下向非动态ActionScript 3类添加行为?_Apache Flex_Actionscript 3_Extension Methods - Fatal编程技术网

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不同)。要解决此问题,您可以:

  • 创建spriteaset.as的副本,并将其添加到您位于/mx/core/spriteaset.as的项目中
  • 编辑本地副本以修复发现的任何问题
  • 运行ap

  • 谷歌“”获取更多示例和说明。

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