使用'Class'数据类型时,如何指定类型,以便我只接受特定类的子类?

时间:2015-01-29 01:07:44

标签: actionscript-3 class actionscript superclass

我有一个方法接受Class类型的参数,我想只接受扩展SuperClass的类。现在,我可以想到的就是这个,它对一个实例进行运行时检查:

public function careless(SomeClass:Class):void {
    var instance:SomeClass = new SomeClass();
    if (instance as SuperClass) {
        // great, i guess
    } else {
        // damn, wish i'd have known this at compile time
    }

}

有没有办法做这样的事情,所以我可以放心,Class实例扩展了一些超类?

public function careful(SomeClass:[Class extends SuperClass]):void {
    var instance:SuperClass = new SomeClass();
    // all is good
}

4 个答案:

答案 0 :(得分:1)

如果您要进行实例化,为什么不接受一个允许您将其键入:SuperClass的对象?

careless(SomeClass);
//vs.
careless(new SomeClass);

就代码而言,没有太多问题。 但是有一些不同之处:

  • 必须创建对象,因为需要一个对象。如果您的函数在某些情况下没有实例化该类,则可能会出现问题。传递对象或null的其他逻辑可以使函数调用膨胀。
  • 如果你不能在该函数之外调用构造函数,它就不会 工作要么。

所有这些都是由工厂模式解决的。将工厂作为生成SuperClass个对象的参数传递。

function careful(factory:SuperClassFactory)

答案 1 :(得分:1)

您的要求:

  

我想只接受扩展SuperClass

的类

  

我需要传入一个类,以便可以多次实例化它   以后通过其他对象

可以通过传入所需类的实例并使用Object.constructor()方法来实现。

public function careful(someInstance:SuperClass):void {
    //you probably want to store classRef in a member variable
    var classRef: Class = someInstance.constructor();

    //the following is guaranteed to cast correctly,
    //since someInstance will always be a descendant of SuperClass  
    var myInst:SuperClass = new classRef() as SuperClass; 
}

More reading here.

答案 2 :(得分:0)

你不能在ActionScript 3中这样做。在像C#这样的语言中你可以做类似的事情(如果语法关闭,请原谅我):

public void Careless<T>() where T : SuperClass

但AS3没有“仿制药”。不幸的是,我知道如何做你想做的事的唯一方法就是你已经完成的方式。

可能更适合您的用例的模式可能类似于:

class SuperClass
{
    public static function careless():void
    {
       var instance:SuperClass = new SuperClass();

       // ...
    }
}

在ActionScript 3中进行静态类型检查的唯一方法是提供类的实例

答案 3 :(得分:0)

这是可能的,但它很昂贵。您可以在类(非实例)上使用:

flash.utils.describeType

然后,您将获得包含大量信息的XML,包括该类的继承。就像我说这是一个昂贵的过程,可能创建一个实例并在大多数情况下检查它会更快。