haxe
Abstracts
Sök…
Syntax
- abstrakt identifierare ( underylingstyp ) {...}
- abstrakt identifierare ( underliggande typ ) från typA från typB ... till typA till typB {...}
Anmärkningar
En abstrakt typ är en kompileringstyp som löser sig till den underliggande typen vid körtid . Detta betyder att din abstrakta typ inte finns i källkoden som genereras av Haxe-kompilatorn. I stället placeras den underliggande typen eller de typer som definieras för implicit casting.
Sammanfattningar betecknas av det abstract nyckelordet, följt av en identifierare och den underliggande typen inom parentes.
Sammanfattningar får bara definiera metodfält och icke-fysiska egendomsfält. Icke-inriktade metodfält deklareras som statiska funktioner i en privat implementeringsklass och accepterar som ett ytterligare första argument den underliggande typen av abstrakt.
Observera att överbelastning av operatören endast är möjlig för abstrakta typer.
Sammanfattning för validering av data
Följande abstrakt definierar en e- EmailAddress baserad på String som kommer att använda ett vanligt uttryck för att validera det godkända argumentet som en e-postadress. Om adressen inte är giltig kommer ett undantag att kastas.
abstract EmailAddress(String) {
static var ereg = ~/^[\w-\.]{2,}@[\w-\.]{2,}\.[a-z]{2,6}$/i;
inline public function new(address:String) {
if (!ereg.match(address)) throw "EmailAddress "$address" is invalid";
this = address.toLowerCase();
}
}
Använd abstrakt enligt följande.
var emailGood = new EmailAddress("[email protected]");
var emailBad = new EmailAddress("john.doe.com");
Prova exemplet på try.haxe.org .
referenser
Operatörens överbelastning
Operatörens överbelastning är endast möjlig med abstrakta typer.
Följande abstrakt definierar en Vec2i typ baserad på Array<Int> -typen. Detta är en tvåkomponentvektor med heltal. Operatörens överbelastning möjliggörs min @:op kompilatormetadata . Endast de tillgängliga numeriska operatörerna kan överbelastas - anpassade operatörer får inte anges.
abstract Vec2i(Array<Int>) {
public inline function getX() : Int {
return this[0];
}
public inline function getY() : Int {
return this[1];
}
public inline function new(x : Int, y : Int) {
this = [x, y];
}
@:op(A + B)
public inline function add(B : Vec2i) : Vec2i {
return new Vec2i(
getX() + B.getX(),
getY() + B.getY()
);
}
}
Använd abstrakt enligt följande.
var v1 = new Vec2i(1, 2);
var v2 = new Vec2i(3, 4);
v1 + v2;
v1.add(v2);
Prova exemplet på try.haxe.org .