2009-09-09 108 views
2

我们拥有类对象(即引用的类的对象),所以你可以创建该类对象的对象:如何知道Class对象引用了哪个类?

var classObject:Class = package.to.class.AClass; 
var objectFromClass:AClass = new classObject(); 

现在,我想知道什么对象是classObject引用。例如:

function Creator(classObject:Class):AClass 
{ 
    // here I want to know what class is referenced by classObject 
    return new classObject(); 
} 

var classObject:Class = package.to.class.AClass; 
var objectFromClass:AClass = Creator(classObject); 

这是行得通的,但是如果我传递一个不引用AClass的Class对象呢?我想知道这是否会发生,并对此产生影响。

---编辑---

搜索,我发现这个功能

flash.utils.getQualifiedClassName(价值:*):字符串 该函数返回类的名称,例如:

var name:String = ''; 
// name = '' 

name = flash.utils.getQualifiedClassName(package.to.class.AClass); 
// name = 'AClass' 

name = '' 
// name = '' 

var anInstance:AClass = new AClass(); 
name = flash.utils.getQualifiedClassName(anInstance); 
// name = 'AClass' 

因此,所有我需要做的是比较该函数的结果:

function Creator(classObject:Class):AClass 
{ 
    var anInstance:AClass = new AClass(); 
    var className:String = flash.utils.getQualifiedClassName(anInstance); 
    var classObjectName:String = flash.utils.getQualifiedClassName(classObject); 

    // here className and classObjectName are 'AClass' :) 
    if (className != classObjectName) 
     throw new Error('The classes are different'); 

    return new classObject(); 
} 

var classObject:Class = package.to.class.AClass; 
var objectFromClass:AClass = Creator(classObject); 

--- EDIT 2 ---

另一种方法是使用Object类的constructor属性:

function Creator(classObject:Class):AClass 
{ 
    var tempInstance:AClass = new AClass(); 
    var tempClassObject:Class = Object(tempInstance).constructor; 

    if (classObject != tempClassObject) 
     throw new Error('The classes are different'); 

    return new classObject(); 
} 

回答

1

我发现,最简单的(不知道这是否是最快)的方式完成此任务是在接下来的例子:

function Creator(classObject:Class):AClass 
{ 
    var anInstance:Object = new classObject() as AClass; 
    if (anInstance == null) 
     throw new Error('The classes are different'); 

    return new classObject(); // or return anInstance as AClass; 
} 

这也适用,如果AClass是一个接口。

+1

不是转换为AClass并检查它是否为空,为什么不使用'is'运算符? – Turambar 2009-09-10 17:19:59

相关问题