0

我创建了一个类,它根据传递给它的名称加载它的子类。该函数使用 getDefinitionByName,获取类类型并将其实例化,如果该类是拥有此方法的类的子类型,则返回它。子类型都是扩展基类的 mxml 文件,以简化实例化控件。

但是,在我向它传递一个完全限定名称的情况下,它在我的单元测试中有效,但在我的应用程序上下文中执行它时会失败。getDefinitionByName 中是否有一个陷阱,使它在不同的执行上下文中表现不同?有没有更简单的方法来通过它们的限定名称加载类?

static public function loadDisplay(className:String, extendedClassName:String = null):FeatureDisplay
{
    try
    {
        trace("Loading", className);
        var cls:Class = getDefinitionByName(className) as Class;
        var display:FeatureDisplay = new cls() as FeatureDisplay;
        if(display)
        {
            return display;
        }
        else
        {
            trace(className, "is not a subclass of FeatureDisplay");
            return null;
        }
    }
    catch(error:Error)
    {
        trace("Error loading", className);
        trace("Error:", error.message);
    }
    return null;
}
4

2 回答 2

3

我的第一个问题是您是否在任何地方明确使用任何类?如果您实际上不使用某个类,即使它是导入的,ActionScript 也可能不会在 swf 中保留该类定义的副本。

也就是说,如果可以避免的话,最好避免使用 getDefinitionByName、describeType、getQualifiedClassName 或 getQualifiedSuperclassName。它们是记忆猪,通常最好避免使用它们。(除非您无法控制在运行时将使用哪些类,并且必须通过 getDefinitionByName 使用它们)

我的建议是您将 getQualifiedClassName 替换为 swtich...case:

// Import the subclasses.
import path.to.SpriteFeatureDisplay;
import path.to.OtherFeatureDisplay;

class FeatureDisplay extends Sprite{

   //Make one public static const per class.
   public static const SPRITE_FEATURE_DISPLAY:String = "sprite_feature_display";
   public static const OTHER_FEATURE_DISPLAY:String  = "other_feature_display";

   public static function loadDisplay(  className:String, 
                                        extName:String = null ):FeatureDisplay
   {
      trace("Loading", className);

      // This will ensure that each of the classes is stored in the swf
      // it will behave faster, and it is less prone to errors (note that 
      // try...catch is not needed).
      swtich( className )
      {
          case SPRITE_FEATURE_DISPLAY:
            return new SpriteFeatureDisplay();
          case OTHER_FEATURE_DISPLAY:
            return new OtherFeatureDisplay();
          default:
            trace( "Requested class " + className + " could not be created..." +
            "\nPlease make sure that it is a subclass of FeatureDisplay" );
            return null;
      }
      return null;
   }
}
于 2009-08-20T20:30:22.087 回答
2

仅供参考,我已经看到了以下在 Flex 源代码中保留类的方法:

// References.cs

// notice the double reference: one to import, the other to reference
import package.to.ClassA; ClassA;
import package.to.ClassB; ClassB;
import package.to.ClassC; ClassC;

当然,您仍然必须在某处引用“References”类。

于 2009-08-25T07:14:21.850 回答