我有一个方法接受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
}
答案 0 :(得分:1)
如果您要进行实例化,为什么不接受一个允许您将其键入:SuperClass
的对象?
careless(SomeClass);
//vs.
careless(new SomeClass);
就代码而言,没有太多问题。 但是有一些不同之处:
所有这些都是由工厂模式解决的。将工厂作为生成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;
}
答案 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,包括该类的继承。就像我说这是一个昂贵的过程,可能创建一个实例并在大多数情况下检查它会更快。