AS3: приведение переменной как динамического типа - PullRequest
2 голосов
/ 01 ноября 2010

Можно ли динамически приводить переменную как тип, где типом будет переменная типа Class?

Считайте следующее (недействительным):

var myClass:Class = MyClass;
var myInstance:myClass = new myClass();

Для контекста: я работаю во Flex (4) над созданием модального менеджера, который будет управлять различными аспектами создания модов (через PopUpManager), и я бы хотел, чтобы он был минимальным. Компоненты будут передаваться через одни и те же функции, и вместо того, чтобы позволять преобразовывать переменные любого типа, например:

var myInstance:* = new myClass();

Я бы предпочел сделать это как можно более явным. Конечно, у AFAIK нет никаких реальных преимуществ, поскольку существуют проверки, чтобы убедиться, что аргумент имеет тип Class перед присваиванием - это больше POC, чем что-либо.

Любые мысли приветствуются.

Редактировать: Полагаю, я мог бы сделать следующее:

var myClass:Class = MyClass;
var myInstance:* = new myClass() as myClass;

но я не уверен, что это лучший способ сделать это.

Ответы [ 3 ]

3 голосов
/ 01 ноября 2010

Я не знаю, является ли это той же проблемой, что и у вас, или нет.Мне нужно было иметь класс, у которого был ребенок, который реализовывал интерфейс.Реализующий класс может быть любым, но мне нужно было сохранить и загрузить всю его информацию.

Допустим, у меня есть следующее:

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(), - это то, что вы хотите.

Надеемся, что это было полезно.

2 голосов
/ 01 ноября 2010

Я не думаю, что компилятор может обрабатывать динамическую типизацию. Если бы это было возможно, было бы возможно реализовать функции, аналогичные Generics.

Я думаю, лучшее, что вы можете сделать, это:

var myClass:Class = MyClass;
var myObject:* = new myClass();
0 голосов
/ 01 ноября 2010

Я так не думаю. Когда я ожидаю, что будет передано более одного типа, я делаю что-то вроде этого:

public function doSomethingWithThis(something:Object):void {
    var button:Button = something as Button;
    var image:Image = something as Image;
    var list:List = something as List;


    if (button) {


    }
    else if (image) {


    }
    else if (list) {


    }
    else {
        throw new Error("This type of object will not work with this method.");
    }


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