2010-09-24 4 views
0

Есть ли способ определить неявные или явные преобразования типов в ActionScript?Пользовательские преобразования типов в ActionScript?

Например, я хочу определить преобразование таким образом, что Array может быть введено в MyClass неявно. Если нет, явное приведение было бы полезно. Я знаю, что всегда могу передать его в свой конструктор, но я имею в виду семантику здесь, и меня больше всего интересует решение конверсии, если оно существует.

ответ

1

Тип отливка в ActionScript 3

Object(instanceOfOtherObject); 

Работы на основе valueOf имущества данного класса (если она определена). Таким образом, вы можете определить класс MyClass как таковые:

package { 
    public class MyClass { 

     private var myArray:Array; 

     public function MyClass(inputArray:Array = null) { 
      myArray = (inputArray ? inputArray : new Array()); 
     } 

     public function valueOf():Array { 
      return myArray; 
     } 
    } 
} 

Тогда вы будете в состоянии выполнить эти типажи:

var mc:myClass = new MyClass(); 
var arr:Array = Array(myClass); 

Насколько мне известно, обратный не вариант, так как функция valueOf из Массив не возвращает объект типа MyClass. Нет ничего, что помешает вам создать CastableArray, который расширяет и отменяет функцию valueOf от Array, чтобы вернуть экземпляр MyClass с использованием указанного выше конструктора, хотя вы можете столкнуться с другими проблемами с другими основными языковыми компонентами, которые ожидают, что Array будет возвращает Array в свой valueOf свойство (сравнение объектов приходит на ум).

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

+0

Очень информативно :) Спасибо! Я решил свою проблему, расширив прототип массива, чтобы включить 'Array.prototype.asMyClass = function(): MyClass {}'. Это позволяет мне взять любой массив и вызвать 'theArray.AsMyClass()', и он работает так же хорошо, как я могу попросить. –

+0

Это умное решение. Рад, что это было по крайней мере для некоторых целей, помните о подводных камнях об перечислении, как это определено в этой статье: http://tobyho.com/Modifying_Core_Types_in_ActionScript_3_Using_the_Prototype_Object – Aaron

Смежные вопросы