클래스를 상속하지 않고 비동적 ActionScript 3 클래스에 동작을 추가할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/7212

문제

내가하고 싶은 일은 다음과 같습니다.

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

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

즉, 생성된 클래스를 상속이 아닌 프로토타입을 통해 단일 메서드로 확장하고 싶습니다.

클래스는 WSDL에서 생성되며 동적 클래스가 아니며 생성된 코드는 어쨌든 덮어쓰게 되므로 건드리고 싶지 않습니다.

간단히 말해서 AS3용 C# 3:s 확장 방법과 도덕적으로 동등한 기능을 갖고 싶습니다.

편집하다:나는 aib의 대답을 받아들였습니다. 왜냐하면 그것이 내가 요청한 것에 가장 적합했기 때문입니다. 비록 더 깊이 생각해 보면 내 문제가 실제로 해결되지는 않지만 잘못된 질문을 한 것은 내 잘못입니다.:) 또한 좋은 제안에 대한 upmods도 있습니다.

도움이 되었습니까?

해결책

네, 그런 일이 가능합니다.

실제로 귀하의 예는 솔루션에 매우 가깝습니다.

노력하다

foo["method"]();

대신에

foo.method();

다른 팁

@테오: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는 생성된 코드를 수정하는 것과 마찬가지로 상속이 허용되지 않는다고 말했습니다.(그렇지 않다면 클래스 정의에 "동적"을 추가하는 것이 아마도 가장 쉬운 해결책일 것입니다.)

클래스에 있는 메서드 수에 따라 다음과 같이 작동할 수 있습니다.

실제 수업:

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

@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 하지만 생성된 코드를 수정하여 원하는 메서드를 포함하거나 클래스를 동적으로 만들 수 없다면 어떻게 해야 할지 모르겠습니다.

또 다른 해결 방법은 생성된 클래스의 소스를 수정하는 단계를 빌드 프로세스에 추가하는 것입니다.WSDL에서 코드를 생성하는 단계가 이미 있다고 가정하므로 그 후에 필요한 메서드를 삽입하는 단계를 추가하면 됩니다.

원숭이 패치는 (우아하지 않은) 옵션입니다.

예를 들어 Flex 3 SpriteAsset.as가 Flex 2와 달리 [7,7,7,7]의 기본 테두리 메트릭을 반환한다는 사실이 마음에 들지 않는다고 가정해 보겠습니다.이 문제를 해결하려면 다음을 수행하세요.

  1. SpriteAsset.as의 복사본을 만들고 이를 프로젝트의 /mx/core/SpriteAsset.as에 추가합니다.
  2. 발견된 문제를 해결하려면 로컬 복사본을 편집하세요.
  3. 앱 실행

Google "플렉스 몽키 패치"를 참조하여 더 많은 예시와 지침을 확인하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top