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 に答える