ActionScript 3
Rodzaje
Szukaj…
Typ Casting
Rzutowanie typu odbywa się za pomocą operatora as :
var chair:Chair = furniture as Chair;
Lub przez zawinięcie wartości w Type() :
var chair:Chair = Chair(furniture);
Jeśli rzutowanie zakończy się niepowodzeniem as , wynik tego rzutu jest null . Jeśli rzutowanie nie powiedzie się przez zawijanie w Type() , TypeError jest błąd TypeError .
Typ funkcji
Funkcje są typu Function :
function example():void { }
trace(example is Function); // true
Mogą się do nich odwoływać inne zmienne o typie Function :
var ref:Function = example;
ref(); // ref.call(), ref.apply(), etc.
I mogą być przekazywane jako argumenty dla parametrów, których typ to Function :
function test(callback:Function):void {
callback();
}
test(function() {
trace('It works!');
}); // Output: It works!
Typ klasy
Odniesienia do deklaracji klas są wpisywane Class :
var spriteClass:Class = Sprite;
Możesz użyć zmiennych typu Class aby utworzyć instancję tej klasy:
var sprite:Sprite = new spriteClass();
Może to być przydatne do przekazania argumentu typu Class do funkcji, która może utworzyć i instancję podanej klasy:
function create(type:Class, x:int, y:int):* {
var thing:* = new type();
thing.x = x;
thing.y = y;
return thing;
}
var sprite:Sprite = create(Sprite, 100, 100);
Typy adnotacji
Możesz podać kompilatorowi typ wartości, dodając do niego adnotację :Type :
var value:int = 10; // A property "value" of type "int".
Parametry funkcji i typy zwracane mogą być również opatrzone adnotacjami:
// This function accepts two ints and returns an int.
function sum(a:int, b:int):int {
return a + b;
}
Próba przypisania wartości z niedopasowania typu będzie skutkować TypeError :
var sprite:Sprite = 10; // 10 is not a Sprite.
Sprawdzanie typów
Za pomocą operatora is można sprawdzić, czy wartość określonego typu:
var sprite:Sprite = new Sprite();
trace(sprite is Sprite); // true
trace(sprite is DisplayObject); // true, Sprite inherits DisplayObject
trace(sprite is IBitmapDrawable); // true, DisplayObject implements IBitmapDrawable
trace(sprite is Number); // false
trace(sprite is Bitmap); // false, Bitmap inherits DisplayObject
// but is not inherited by Sprite.
Istnieje także instanceof operator (przestarzałe), który działa niemal identyczna is poza tym, że zwraca false podczas sprawdzania wdrożonych interfejsów i typów int / uint.
as operator może również stosować tak jak is operator. Jest to szczególnie przydatne, jeśli używasz inteligentnego IDE, takiego jak FlashDevelop, który da ci listę wszystkich możliwych właściwości jawnego typu obiektu. Przykład:
for (var i:int = 0; i < a.length; i++){
var d:DisplayObject = a[i] as DisplayObject;
if (!d) continue;
d.//get hints here
stage.addChild(d);
}
Aby uzyskać ten sam efekt, is napisać (nieco mniej wygodne):
for (var i:int = 0; i < a.length; i++){
if (a[i] is DisplayObject != true) continue;
var d:DisplayObject = a[i] as DisplayObject;
stage.addChild(d);
}
Pamiętaj tylko, że podczas sprawdzania kodowań as operator, podana wartość zostanie najpierw skonwertowana na określony typ, a następnie wynik tej operacji zostanie sprawdzony, jeśli nie jest fałszywy, więc zachowaj ostrożność, używając jej z możliwymi wartościami false / NaN:
if(false as Boolean) trace("This will not be executed");
if(false as Boolean != null) trace("But this will be");
Poniższa tabela pokazuje podstawowe wartości i typy z wynikami operatorów typów. Zielone komórki będą oceniać na prawdę, czerwone na fałsz, a szarość spowoduje błędy kompilacji / działania.
Wpisane tablice
Niestety w języku ActionScript 3 nie ma pojęcia rodzajowego, dlatego nie można zdefiniować tablicy typowanej jako Array<T> . Istnieje jednak specjalna klasa Vector.<T> która działa w podobny sposób, z tym wyjątkiem, że podczas tworzenia wektora należy podać odwołanie do konkretnej klasy . Oznacza to, że nie ma możliwości budowania abstrakcji na typie Vector.<T> (np. Rozszerzenie i dodanie nowej funkcjonalności), co jest ogromną wadą.
Prostszym sposobem patrzenia jest to, jakby każda zdefiniowana przez ciebie klasa automatycznie miała klasę towarzyszącą o nazwie Vector.<NameOfYourClass> .
To powiedziawszy, nadal istnieją ogromne zalety typu Vector.<T> porównaniu z konwencjonalną tablicą:
- Podczas pracy z urządzeniem
Vector.<T>występuje wzrost wydajnościVector.<T>vs tablice 1 . - Otrzymujesz kompilacji typ
TypeErrorów jeśli próba wstawienia wartości non-T do odbioru. - IDE dostarczają użytecznych informacji wskazujących na typ obiektów wewnątrz instancji
Vector.<T>.
Przykłady tworzenia Vector.<T> :
var strings:Vector.<String> = new Vector.<String>(); // or
var numbers:Vector.<Number> = new <Number>[];
1 Wektory zapewniają zauważalną poprawę wydajności w porównaniu do tablic podczas pracy z typami pierwotnymi ( String , int , uint , Number itp.).
