5

我想做的是如下所示:

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

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

也就是说,我想用一个方法来扩展一个生成的类,而不是通过继承,而是通过原型。

该类是从 WSDL 生成的,它不是动态类,我不想接触生成的代码,因为无论如何它都会被覆盖。

长话短说,我希望在道德上等同于 C# 3:s 的 AS3 扩展方法。

编辑:我接受了 aib 的回答,因为它最符合我的要求——尽管经过进一步思考,它并不能真正解决我的问题,但这是我提出错误问题的错。:) 另外,upmods 的好建议。

4

5 回答 5

3

是的,这样的事情是可能的。

实际上,您的示例非常接近解决方案。

尝试

foo["method"]();

代替

foo.method();
于 2008-08-12T14:31:44.300 回答
3

@Theo:您将如何解释在 3.0.0.477 中使用默认 flex-config.xml (<strict>true</strict>) 甚至传递给 mxmlc 的 -compiler.strict 参数的以下工作?

Foo.as:

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

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

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

请注意,OP 说继承是不可接受的,修改生成的代码也是如此。(如果不是这样,在类定义中添加“动态”可能是最简单的解决方案。)

于 2008-08-14T10:55:50.283 回答
2

根据您的课程有多少方法,这可能有效:

实际班级:

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();
于 2008-08-14T16:07:33.617 回答
1

不幸的是,@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!"
    }

}

当您想使用 aFoo时,还需要额外的方法,您需要将Foo实例包装在 a 中FooWrapper并使用该对象。

这不是最方便的解决方案,有很多输入,如果生成的代码发生更改,您必须FooWrapper手动更改类,但除非您可以修改生成的代码以包含您想要的方法或使类动态我不不知道怎么做。

另一种解决方案是在您的构建过程中添加一个修改生成类的源的步骤。我假设您已经有一个从 WSDL 生成代码的步骤,所以您可以做的是在插入您需要的方法之后添加一个步骤。

于 2008-08-13T15:38:07.253 回答
1

Monkey patching 是一个(不优雅的)选项。

例如,假设您不喜欢 Flex 3 SpriteAsset.as 返回的默认边框度量 [7,7,7,7](与 flex 2 不同)这一事实。要解决此问题,您可以:

  1. 创建 SpriteAsset.as 的副本并将其添加到您的项目中 /mx/core/SpriteAsset.as
  2. 编辑您的本地副本以解决您发现的任何问题
  3. 运行你的应用程序

谷歌“ flex monkey patch ”获取更多示例和说明。

于 2008-09-17T20:09:30.463 回答