Странное поведение от getDefinitionByName - PullRequest
0 голосов
/ 21 августа 2009

Я создал класс, который загружает его подклассы на основе переданного ему имени. Функция использует 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;
}

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Мой первый вопрос: вы явно используете где-нибудь из классов? Если вы на самом деле не используете класс, даже если он импортирован, ActionScript может не сохранить копию определения класса в swf.

Тем не менее, вам лучше избегать getDefinitionByName, descriptionType, 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;
   }
}
2 голосов
/ 25 августа 2009

Между прочим, я видел следующий метод хранения классов, используемый в исходном коде 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;

Конечно, вы все равно должны ссылаться на класс "Ссылки".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...