是否有可能增加行为的非动态ActionScript3类,而不继承的课吗?
-
08-06-2019 - |
题
什么我想要做的就是喜欢的东西如下:
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).为了解决这个问题,你可以:
- 创建一个复制的SpriteAsset.作为和将它添加到项目/mx/core/SpriteAsset.作为
- 编辑本地复制,以解决任何问题你找到
- 运行ap
谷歌"flex猴子补丁"更多的例子和说明。