문제

ActionScript 클래스 인스턴스를 어떻게 얻습니까? Class 그 수업의 사례에서?

파이썬에서는 이것이 될 것입니다 x.__class__; 자바에서 x.getClass();.

나는 그것을 알고있다 끔찍한 해킹 이를 위해 존재하지만, 내장 언어 시설 또는 적어도 신뢰할 수있는 무언가를 기반으로 구축 된 도서관 루틴을 찾고 있습니다.

도움이 되었습니까?

해결책

기본 객체 클래스의 '생성자'속성을 통해 얻을 수 있습니다. 즉:

var myClass:Class = Object(myObj).constructor;

다른 팁

당신이 이것을 할 수 없었던 이유가 있습니까?

var s:Sprite = new flash.display.Sprite();

var className:String = flash.utils.getQualifiedClassName( s );
var myClass:Class = flash.utils.getDefinitionByName( className ) as Class;

trace(className ); // flash.display::Sprite
trace(myClass); // [class Sprite]

var s2 = new myClass();
trace(s2); // [object Sprite]

나는 문자열을 통해 왕복을 피하는 방법을 모르지만 충분히 잘 작동해야합니다.

받아 들여지는 (그리고 현재 가장 인기있는 답변)에는 약간의 결함이 있습니다. 답은이 특정 사용 사례에 사용되지만 의견은 보이는 일반적인 솔루션에 대한 답을 확장했습니다.

그러나 어떤 경우에는 유형 안전 솔루션이 아니며 가능한 모든 객체를 다루지는 않습니다. XML이 지원되지 않는다는 아이디어는 여기와 다른 곳에서 충분히 해결되었지만 유형-안전 아이디어는 그렇지 않았습니다.

가정은 프로그래머가 만든 클래스 객체라고 가정합니다. 다음은 내가 설정 한 몇 가지 테스트입니다 (이것은 엄격한 모드이지만 로컬 테스트입니다). 참고 int 시험 결과:

var sprite:Sprite = new Sprite();
var xml:XML = new XML();
var testInt:int = 2;
var testClass:TestClass = new TestClass();
var testAnon:Object = {};

trace("classname 1 = " + getQualifiedClassName(sprite));
trace("myclass 1 = " + getDefinitionByName(getQualifiedClassName(sprite)));
trace("constructor a 1 = " + Object(sprite).constructor);
trace("constructor a 1 = " + (Object(sprite).constructor as Class));
trace("constructor b 1 = " + sprite["constructor"]);
trace("constructor b 1 = " + (sprite["constructor"] as Class));
trace("...");
trace("classname 2 = " + getQualifiedClassName(xml));
trace("myclass 2 = " + getDefinitionByName(getQualifiedClassName(xml)));
trace("constructor a 2 = " + Object(xml).constructor);
trace("constructor a 2 = " + (Object(xml).constructor as Class));
trace("constructor b 2 = " + xml["constructor"]);
trace("constructor b 2 = " + (xml["constructor"] as Class));
trace("...");
trace("classname 3 = " + getQualifiedClassName(testInt));
trace("myclass 3 = " + getDefinitionByName(getQualifiedClassName(testInt)));
trace("constructor a 3 = " + Object(testInt).constructor);
trace("constructor a 3 = " + (Object(testInt).constructor as Class));
trace("constructor b 3 = " + testInt["constructor"]);
trace("constructor b 3 = " + (testInt["constructor"] as Class));
trace("...");
trace("classname 4 = " + getQualifiedClassName(testClass));
trace("myclass 4 = " + getDefinitionByName(getQualifiedClassName(testClass)));
trace("constructor a 4 = " + Object(testClass).constructor);
trace("constructor a 4 = " + (Object(testClass).constructor as Class));
trace("constructor b 4 = " + testClass["constructor"]);
trace("constructor b 4 = " + (testClass["constructor"] as Class));
trace("...");
trace("classname 5 = " + getQualifiedClassName(testAnon));
trace("myclass 5 = " + getDefinitionByName(getQualifiedClassName(testAnon)));
trace("constructor a 5 = " + Object(testAnon).constructor);
trace("constructor a 5 = " + (Object(testAnon).constructor as Class));
trace("constructor b 5 = " + testAnon["constructor"]);
trace("constructor b 5 = " + (testAnon["constructor"] as Class));
trace("...");

와 함께 TestClass 로써 정의 된:

package
{
    public class TestClass
    {
    }
}

결과:

classname 1 = flash.display::Sprite
myclass 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor b 1 = [class Sprite]
constructor b 1 = [class Sprite]
...
classname 2 = XML
myclass 2 = [class XML]
constructor a 2 = 
constructor a 2 = null
constructor b 2 = 
constructor b 2 = null
...
classname 3 = int
myclass 3 = [class int]
constructor a 3 = [class Number]
constructor a 3 = [class Number]
constructor b 3 = [class Number]
constructor b 3 = [class Number]
...
classname 4 = src::TestClass
myclass 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor b 4 = [class TestClass]
constructor b 4 = [class TestClass]
...
classname 5 = Object
myclass 5 = [class Object]
constructor a 5 = [class Object]
constructor a 5 = [class Object]
constructor b 5 = [class Object]
constructor b 5 = [class Object]
...

현재 테스트 외에도 사용할 이유가 있습니다. getDefinitionByName 위에 constructor 행동 양식. 그만큼 getDefinitionByName 메소드 허용 :

  • (현재 및 미래) 문제가있는 영역을위한 내부 솔루션을 개발하는 Adobe
  • 향후 Adobe 개발을 위해 코드를 변경할 필요가 없습니다.
  • 동적 인스턴스화의 두 가지 (또는 그 이상)를 개발할 필요는 없습니다.

지금은 속도가 느릴 수 있지만 앞으로는 속도 문제를 해결할 Adobe 측에서 개선 될 수 있습니다.

(예를 들어, 그것은 예전입니다 uint 루프보다 훨씬 느 렸습니다 int, 더 빠르게 사용하기 위해 많은 변환 코드가 설정되었습니다. int. 해결하는 것은 상당히 간단한 문제 였으므로 Adobe는 그것을 고쳤으며 이제는 구식 목표를 달성하기 위해 불필요한 후프를 뛰어 넘는 많은 코드가 있습니다.)

이후 getDefinitionByName 메소드는 모든 경우에 올바르게 작동하며 해당 방법을 사용하여 코드를 개발 한 다음 Adobe가 속도 문제를 해결하기 위해 노력해야합니다.

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