Szukaj…


Składnia

  • abstrakcyjny identyfikator ( typ underyling ) {...}
  • streszczenie identyfikator (typu bazowego) z TypeA od TypeB ... do TypeA do TypeB {...}

Uwagi

Typ abstrakcyjny to typ czasu kompilacji, który jest tłumaczony na typ podstawowy w czasie wykonywania . Oznacza to, że ten typ abstrakcyjny nie istnieje w kodzie źródłowym generowanym przez kompilator Haxe. Zamiast tego umieszczany jest typ bazowy lub typy zdefiniowane dla niejawnego rzutowania.

Abstrakty są oznaczone słowem kluczowym abstract , po którym następuje identyfikator i typ w nawiasach.

Streszczenia mogą definiować tylko pola metod i pola właściwości niefizycznych. Nie-wstawiane pola metod są deklarowane jako funkcje statyczne w prywatnej klasie implementacji , przyjmując jako dodatkowy pierwszy argument podstawowy typ abstraktu.

Pamiętaj, że przeciążenie operatora jest możliwe tylko dla typów abstrakcyjnych.

Streszczenia w celu weryfikacji danych

Poniższe streszczenie definiuje EmailAddress typu oparte na String typu, który będzie używać wyrażenia regularnego sprawdzania poprawności przekazany argument jako adres e-mail. Jeśli adres jest nieprawidłowy, zostanie zgłoszony wyjątek.

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

Użyj streszczenia w następujący sposób.

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

Wypróbuj przykład na try.haxe.org .

Bibliografia

Przeciążenie operatora

Przeciążenie operatora jest możliwe tylko w przypadku typów abstrakcyjnych.

Poniższy abstrakt definiuje typ Vec2i oparciu o typ Array<Int> . Jest to wektor dwuskładnikowy o wartościach całkowitych. Przeciążenie operatora jest możliwe w moich metadanych kompilatora @:op . Przeciążone mogą być tylko dostępne operatory numeryczne - nie można określić operatorów niestandardowych.

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

Użyj streszczenia w następujący sposób.

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

Wypróbuj przykład na try.haxe.org .

Bibliografia



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow