2013-12-23 12 views
0

В таких языках, как Java, C++ и т. Д., Есть возможность предоставить, например, функцию toInt(), чтобы обеспечить четкое преобразование кода с помощью языковых функций в данный примитивный тип. (В этом примере Int.)Предоставление примитивных меток в ActionScript 3

То есть, если у вас myObject() со стандартной функцией литья toInt() заявленной, а затем вызывает как Int(myObject) бы просто работать. Это гораздо более актуально для ситуаций, когда вы просто хотите забыть о литье вообще и просто что-то сделать - someVar:Int = myObject + 3 ... для произвольного примера.

Я искал в документах AS3 и сделал некоторые поиски вне этого, но, похоже, в AS3 нет таких наборов функций, интерфейсов и других подобных вещей. Кто-нибудь знает такое? Это кажется существенным знанием на любом языке, который поддерживает такие функции кастинга, и я нахожусь в конце своего острословия с подробностью написания частично квалифицированного имени, например myObject.toInt(), в разгар математической работы.

+0

Существует * некоторые * литье: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f87.html –

+0

Это просто, что если у вас есть пользовательский класс, AS может явно не знает, как чтобы передать его любому другому примитивному типу. –

+0

Эта статья была более бесполезной, чем ничего. То, что он говорит, состоит в том, что вещи в одном дереве наследования имеют некоторую способность быть брошенными друг другу (возможно, тоже принуждались, если бы я должен был догадываться), и что примитивы могут быть переброшены друг в друга. Хотя это имеет некоторое значение, было бы неплохо - например, создать сложный представительский класс цветов, который можно было бы аккуратно привести в число для вычислительных сред. (Только для примера с отбросом.) –

ответ

2

Это распространенное заблуждение, что перегрузка оператора в AS3 невозможна. Это не так, но это не совсем обычная практика, и она не работает, как на других языках.

AS3 «постепенно набирается». Это означает, что вы можете указать тип, когда захотите, вам не нужно, и при выполнении операций на двух разных типах он будет логически вывести/бросить вас.

Для объектов AS3 предоставляет функции valueOf():Object и toString():String, которые позволяют вам определять автоматическую обработку отливки. Первая обеспечивает «примитивное значение объекта», а вторая определяет «Строковое представление объекта».

Значением по умолчанию для строки является String "[object ClassName]", но вы можете переопределить это значение по умолчанию. Вот пример:

package 
{ 
    import flash.display.Sprite; 
    import flash.utils.getQualifiedClassName; 

    public class Main extends Sprite 
    { 
    public function Main():void 
    { 
     trace("-----------------------------"); 
     var foo = new MyClass(); 
     trace("foo is: "); 
     trace(foo); 
     trace("foo+foo is:"); 
     trace(foo+foo); 
     trace("foo+foo+'--' is:"); 
     trace(foo+foo+"--"); 
     trace("'--'+foo+foo is:"); 
     trace("--"+foo+foo); 
     trace("Math.PI/foo:"); 
     trace(Math.PI/foo); 
     trace("'5'+foo is:"); 
     trace('5'+foo); 
     trace("false || foo is:"); 
     trace((false || foo)); 
     trace("foo | 0xC is:"); 
     trace(foo | 0xC); 
     trace("typeof(foo) is:"); 
     trace(typeof(foo)); 
     trace("getQualifiedClassName(foo) is:"); 
     trace(getQualifiedClassName(foo)); 
    } 

    } 
} 

class MyClass { 
    public function valueOf():Object { return 3; } 
    public function toString():String { return "three"; } 
} 

И выход след:

----------------------------- 
foo is: 
three 
foo+foo is: 
6 
foo+foo+'--' is: 
6-- 
'--'+foo+foo is: 
--threethree 
Math.PI/foo: 
1.0471975511965976 
'5'+foo is: 
5three 
false || foo is: 
three 
foo | 0xC is: 
15 
typeof(foo) is: 
object 
getQualifiedClassName(foo) is: 
Main.as$30::MyClass 

Логическое толкование интересно, но любой ненулевой объект (или String) верно, так на самом деле она работает. Является ли время выполнения вызовом valueOf() или toString(), зависит от типов других аргументов операторов.

+0

Я не уверен, почему я не доверял им, чтобы поставить его на самый высокий уровень общего иерархического класса «Объект». Так же, как дополнение, можно найти соответствующие документы для определения функций по умолчанию [здесь] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Object.html#methodSummary) –

+0

Спасибо за напоминание меня, я добавил ссылки на документы в ответ. –