Ricerca…


Sintassi

  • identificativo astratto ( tipo sottotitoli ) {...}
  • identificatore astratto ( tipo sottostante ) da tipoA da tipoB ... a tipoA a tipoB {...}

Osservazioni

Un tipo astratto è un tipo in fase di compilazione che si risolve nel tipo sottostante in fase di esecuzione . Ciò significa che il tipo astratto non esiste nel codice sorgente generato dal compilatore Haxe. Al suo posto vengono posizionati il ​​tipo sottostante o i tipi definiti per il casting implicito.

Gli abstract sono indicati dalla parola chiave abstract , seguita da un identificatore e dal tipo sottostante tra parentesi.

Gli abstract possono solo definire campi metodo e campi proprietà non fisiche. I campi del metodo non inline vengono dichiarati come funzioni statiche in una classe di implementazione privata, accettando come primo argomento aggiuntivo il tipo sottostante dell'estratto.

Si noti che l'overloading dell'operatore è possibile solo per i tipi astratti.

Estratti per la convalida dei dati

L'abstract seguente definisce un tipo EmailAddress basato sul tipo String che utilizzerà un'espressione regolare per convalidare l'argomento passato come indirizzo di posta elettronica. Se l'indirizzo non è valido, verrà generata un'eccezione.

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();
  }
}

Usa l'abstract come segue.

var emailGood = new EmailAddress("[email protected]");
var emailBad = new EmailAddress("john.doe.com");

Prova l'esempio su try.haxe.org .

Riferimenti

Sovraccarico dell'operatore

L'overloading dell'operatore è possibile solo con tipi astratti.

L'abstract seguente definisce un tipo di Vec2i basato sul tipo di Array<Int> . Questo è un vettore a due componenti con valori interi. Il sovraccarico dell'operatore è reso possibile dai miei metadati del compilatore @:op . È possibile sovraccaricare solo gli operatori numerici disponibili: non è possibile specificare operatori personalizzati.

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()
        );
    }
}

Usa l'abstract come segue.

var v1 = new Vec2i(1, 2);
var v2 = new Vec2i(3, 4);
v1 + v2;
v1.add(v2);

Prova l'esempio su try.haxe.org .

Riferimenti



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow