Я бы хотел сделать что-то вроде следующего:
FooClass.prototype.method = function():String
{
return "Something";
}
var foo:FooClass = new FooClass();
foo.method();
То есть я хотел бы расширить сгенерированный класс одним методом, но не через наследование, а через прототип.
Класс создается из WSDL, это не динамический класс, и я не хочу касаться сгенерированного кода, потому что он все равно будет перезаписан.
Короче говоря, я хотел бы иметь моральный эквивалент методов расширения C# 3: s для AS3.
Обновлено: я принял ответ aib, потому что он лучше всего соответствует тому, о чем я просил, хотя при дальнейшем размышлении он на самом деле не решает мою проблему, но это моя вина, что я задаю неправильный вопрос. :) Также апмоды за хорошие предложения.





Да, такое возможно.
На самом деле ваш пример очень близок к решению.
Пытаться
foo["method"]();
вместо
foo.method();
@aib, к сожалению, неверен. Предполагая строгий режим (режим компилятора по умолчанию), невозможно изменить прототип нединамических типов классов в ActionScript 3. Я даже не уверен, что это возможно в нестрогом режиме.
Есть вариант накрутки? По сути, вы создаете класс, который принимает один из объектов, которые вы получаете от веб-службы, и просто перенаправляет на него все вызовы методов, но также имеет собственные методы:
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, но если вы не можете изменить сгенерированный код, чтобы включить нужный метод или сделать класс динамическим I не вижу, как это можно сделать.
Другое решение - добавить в процесс сборки шаг, который изменяет источник сгенерированных классов. Я предполагаю, что у вас уже есть шаг, который генерирует код из WSDL, поэтому вы могли бы добавить шаг после этого, который вставляет нужные вам методы.
@Theo: Как бы вы объяснили следующую работу в 3.0.0.477 со стандартным файлом flex-config.xml (
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 назвал наследование неприемлемым, как и изменение сгенерированного кода. (Если бы это было не так, добавление «динамического» к определению класса, вероятно, было бы самым простым решением.)
В зависимости от того, сколько методов имеет ваш класс, это может сработать:
Фактический класс:
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 SpriteAsset.as возвращает метрики границы по умолчанию [7,7,7,7] (в отличие от Flex 2). Чтобы исправить это, вы можете:
Google "гибкий патч обезьяны", чтобы найти больше примеров и инструкций.
@aib прав, я ошибся, когда тестировал. Я забыл, что прототип доступен только для класса, а не для каждого объекта, поэтому у меня возникли ошибки времени выполнения. Однако мое решение-оболочка не является подклассом, а является оболочкой. Класс-оболочка расширяет оригинал только так, чтобы он имел тот же тип.