Typedef

Typedef -- это конструкция, определяющая типы для проверки типов анонимных типов. Во завернул! Уж не знаю, как это можно объяснить нормальным языком. Это что-то вроде интерфейсов, только там описаны свойства объекта, а не методы. Например, если мы опишем тип таким образом:

typedef Human = { numHeads : Int, numHands : Int, numLegs : Int }

то такому типу будет соответсвовать любой объект, имеющий свойства numHeads, numHands, numLegs типа Int. И любой такой объект мы можем передать в данной ситуации:
typedef Human = { numHeads : Int, numHands : Int, numLegs : Int }

class Alien
{
    public var numHeads : Int;
    public var numHands : Int;
    public var numLegs : Int;

    public function new()
    {
        this.numHeads = 2;
        this.numHands = 8;
        this.numLegs = 3;
    }
}

function greet(man : Human):Void
{
}

var dangerousCreature:Alien = new Alien();
greet(dangerousCreature);

Здесь функция greet без проблем примет переменную типа Alien, потому что она соответствует типу Human. В отличие от интерфейсов, в классе Alien не нужно указывать, что он реализует тип Human.

Создать экземпляр typedef можно следующим образом:

var goodFellow : Human = { numHeads : 1, numHeands : 2, numLegs : 2 };

Таким образом typedef может заменить собой небольшй класс, предоставляя более лакончный синтаксис. Конечно, это удобно, когда параметров не слишком много, потому что их нужно все перечислять при создании каждого экземпляра.

typedef также можно использовать для создания синонимов для существующих типов. Например:

enum ThreeState
{
  Checked;
  Unchecked;
  Indeterminated;
}
class Person
{
  public var name : String;
  public function new() { }
}

typedef GenericFunction<T> = Void -> T
typedef IntArray = Array<Int>
typedef P = Person
typedef TS = ThreeState

typedef могут содержать функции:

typedef B = {
  x : Float,
  y : Float
  say : String -> String
}

могут описывать шаблоны типов:
typedef Leaf<T> = {
  parent : Node<T>,
  data : T
}

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

Комментарии

А можно

А можно подробнее, во что превращается typedef в результирующей swf?

Пусть, для определённости, есть такой код.

typedef Type = {
  i : Int
}

class Foo
{
  public var i : Int;
  public var foo : String;
  public function new() {}
}

class Bar
{
  public var i : Int;
  public var bar : Float;
  public function new() {}
}

function f( x : Type )
{
}

f( new Foo() );
f( new Bar() );

Type превратится в AS аналог Dynamic - Object и при вызове f будет приведение типов? Или как?

см. чуть выше

А можно подробнее, во что превращается typedef в результирующей swf?

"typedef существует только во время компиляции и используются для проверки типов. В результирующем swf-файле их нет."

нет

Нет, это не скомпилируется.
haXe - строготипизированный язык, который проверяет типы на этапе компиляции (если нет Dynamic или untyped)
Приведение типа без cast возможно только для базовых типов.

Тип Type будет анонимным { i : Int } - нечто вроде структуры с единственным полем - в итоге все это должно работать как-то так

typedef Type = {   i : Int  }
...
var t : Type = { i : 5 };
trace(t);   //выведет {   i : 5  }
var j : Type = 6;
trace (j);   //выведет 6

trace(t+j);   //ошибка компиляции - несоответствие типов
trace(j + t.i);  //выведет 11

f( new Foo() );    //ошибка компиляции - функция требует тип Type, передан экземпляр класса Foo, который имеет тип Foo

очень просто, но очень удобно

Определение типа - очень простая, но полезная вещь.
Сделав пару проектов на haXe я так к ней привык, что когда после этого пришлось снова возвращаться к AS её иногда очень не хватает.
Прежде всего это проявляется в работе с мелкими (да и не очень) объектами, передаваемыми на сервер и обратно. С помощью typedef им можно в одну строчку и за минуту задать типы и после этого ты обращаешься уже не с безликим набором полей, которые нужно помнить, а с экземпляром конкретного типа, да ещё получаешь бесплатный автокомплит по нему от компилятора в придачу + проверку типов при компиляции.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.