Я не знаю, является ли это той же проблемой, что и у вас, или нет.Мне нужно было иметь класс, у которого был ребенок, который реализовывал интерфейс.Реализующий класс может быть любым, но мне нужно было сохранить и загрузить всю его информацию.
Допустим, у меня есть следующее:
public interface WindowChild {...}
и
public class Window {
public var child:WindowChild;
}
когда пришло время сохранить окно, я сохранил все в виде большого двоичного объекта XML.Я нашел функцию во Flash Player:
flash.utils.getQualifiedClassName(value:*):String
В документации написано: «Возвращает полное имя класса объекта».Это означает, что String
, который он возвращает, будет что-то вроде your.packages::ClassName
.Когда класс Window
делает вызов getQualifiedClassName(child)
, он получает что-то вроде my.packages.structure::MyImplementation
.
Обратите внимание, что это не путь к интерфейсу WindowChild
, а класс, который я создал, который реализовал этот интерфейс.
Когда пришло время загружать всеэту информацию снова я использовал другую функцию Flash getQualifiedClassName(child)
.Эта функция «Возвращает ссылку на объект класса класса, указанного параметром name».я думаю, что это просто причудливый способ сказать, что он возвращает Object
, но он будет иметь тип Class
.
Все, что мне нужно было сделать, это:
var childClass:Class = getDefinitionByName(childClassName) as Class; //Child class name is what was returned from getQualifiedClassName(child)
child = new childClass(); // This creates a new Object of what ever type childClass is
Этот подход оставит проверку типов во время выполнения, но вы всегда можете добавить еще один промежуточный шаг, чтобы убедиться, что то, что вы хотите получить из new childClass()
, - это то, что вы хотите.
Надеемся, что это было полезно.