什么我想要做的就是喜欢的东西如下:

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

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

这就是说,我想扩展产生类与一个单一的方法,而不是通过继承权,但通过的原型。

类是产生从WSDL,这不是一个动态级,我不想触摸产生的代码,因为它将复盖。

长话短说,我想要有道德等同的C#3:s扩展的方法AS3。

编辑:我接受阿拉伯国际银行的答案,因为它符合我的要求最好--虽然在进一步反思它并没有真正解决我的问题,但这是我的错问错了问题。:)此外,upmods的良好建议。

有帮助吗?

解决方案

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

事实上,你是非常接近解决方案。

尝试

foo["method"]();

而不是的

foo.method();

其他提示

@西奥:你会如何解释以下工作在3.0.0.477与默认flex-config.xml (<strict>真的</strict>)和甚至一个编译器。严格参数传递给mxmlc?

Foo。为:

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

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

footest.为:

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

注意,运所述的继承是不可接受的,因为修改产生的代码。(如果不是这种情况下,添加"动态"类定义很可能是最简单的解决方案。)

这取决于如何许多的方法类,这样可能的工作:

实际类:

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

@阿拉伯国际银行是遗憾的是不正确的。假设严格的模式(默认compiler模式),它是不可能的修改原型的非动态的类型ActionScript3.我甚至不确定,这有可能在非严格的模式。

是环绕一个选择吗?基本上,你创建的一个类需要的一个对象你从网服务,只是转发所有方法的呼吁,但也有方法的其自己的:

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,所以你能做什么是添加一个步骤之后,插入的方法的需要。

猴子修补是一个(不雅)的选择。

例如,假设你不喜欢这样的事实,Flex3SpriteAsset.如返回一个默认的边境指标的[7,7,7,7](不同于flex2).为了解决这个问题,你可以:

  1. 创建一个复制的SpriteAsset.作为和将它添加到项目/mx/core/SpriteAsset.作为
  2. 编辑本地复制,以解决任何问题你找到
  3. 运行ap

谷歌"flex猴子补丁"更多的例子和说明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top