2.4.5 확장(Extensions)

2.4.5 확장(Extensions)

확장은 구조체가 주어진 타입의 모든 필드에 더해, 자신만의 추가 필드도 가진다는 것을 표현할 때 사용해요:

typedef IterableWithLength<T> = {
  > Iterable<T>,
  // read only property
  var length(default, null):Int;
}

class Main {
  static public function main() {
    var array = [1, 2, 3];
    var t:IterableWithLength<Int> = array;
  }
}

보다 큼 연산자 >Iterable<T>의 확장이 만들어지고 있으며, 그 뒤에 추가 클래스 필드가 옴을 나타내요. 이 예제에서는 Int 타입의 읽기 전용 속성(property) length가 요구됩니다.

IterableWithLength<T>와 호환되려면 어떤 타입이 Iterable<T>와 호환되고, Int 타입의 읽기 전용 length 속성을 제공해야 해요. 위 예제에서 이 조건을 충족하는 Array를 할당합니다.

Haxe 3.1.0 이후 — 여러 구조체를 한 번에 확장할 수 있습니다:

typedef WithLength = {
  var length(default, null):Int;
}

typedef IterableWithLengthAndPush<T> = {
  > Iterable<T>,
  > WithLength,
  function push(a:T):Int;
}

Haxe 4.0.0 이후 — 확장의 대체 표기로, 확장되는 각 구조체를 & 기호로 구분할 수 있습니다:

typedef Point2D = {
  var x:Int;
  var y:Int;
}

typedef Point3D = Point2D & {z:Int};

출처: Extensions

본문

확장의 기본 개념

구조체 확장(extension)은 기존 타입(>로 표시)의 모든 필드를 포함하면서 추가 필드를 더한 새 구조 타입을 정의하는 방법이에요. 예를 들어 Iterable<T>length 속성을 더한 IterableWithLength<T>를 만들 수 있답니다.

확장과 호환성

IterableWithLength<T> 타입과 호환되려면 원본 타입(Iterable<T>)과 호환되면서 추가 필드도 제공해야 합니다. 위 예제의 Array는 둘 다 만족해서 할당할 수 있어요.

다중 확장

Haxe 3.1.0부터는 여러 구조체를 한 번에 확장할 수 있어요. 각 확장을 >로 나열하면 됩니다. Haxe 4.0.0부터는 & 기호를 쓰는 더 간결한 표기도 지원합니다.

더 알아보기