Поиск…


Синтаксис

  • абстрактный идентификатор ( тип underyling ) {...}
  • абстрактный идентификатор ( базовый тип ) от typeA от типа B ... до типаA для типа B {...}

замечания

Абстрактный тип - это тип времени компиляции, который разрешает базовый тип во время выполнения . Это означает, что абстрактный тип не существует в исходном коде, сгенерированном компилятором Haxe. Вместо него помещаются базовый тип или типы, определенные для неявного литья.

Тезисы обозначаются ключевым словом abstract , за которым следует идентификатор и базовый тип в круглых скобках.

Тезисы могут определять только поля методов и поля нефизических свойств. Необработанные поля метода объявляются как статические функции в частном классе реализации , принимая в качестве дополнительного первого аргумента базовый тип абстрактного.

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

Тезисы для проверки данных

Следующий абзац определяет тип EmailAddress на основе типа String который будет использовать регулярное выражение для проверки переданного аргумента как адреса электронной почты. Если адрес недействителен, будет выбрано исключение.

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

Используйте реферат следующим образом.

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

Попробуйте пример на try.haxe.org .

Рекомендации

Перегрузка оператора

Перегрузка оператора возможна только с абстрактными типами.

В следующем Vec2i определяется тип Vec2i основанный на типе Array<Int> . Это двухкомпонентный вектор с целыми значениями. Перегрузка оператора стала возможной благодаря моим метаданным @:op компилятора . Могут быть перегружены только доступные числовые операторы - пользовательские операторы не могут быть указаны.

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

Используйте реферат следующим образом.

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

Попробуйте пример на try.haxe.org .

Рекомендации



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow