2.6.2 Dynamic 구현하기(Implementing Dynamic)

2.6.2 Dynamic 구현하기(Implementing Dynamic)

외부(extern) 클래스는 DynamicDynamic<T>구현(implement)할 수 있어요. 이를 통해 임의의 필드 접근이 가능해집니다. 전자의 경우 필드는 어떤 타입이든 가질 수 있고, 후자의 경우 매개변수 타입과 호환되도록 제약됩니다:

extern class ImplementsDynamic implements Dynamic<String> {
  public var present:Int;
  public function new();
}

class Main {
  static public function main() {
    var c = new ImplementsDynamic();
    // valid, present is an existing field
    c.present = 1;
    // valid, assigned value is a String
    c.stringField = "foo";
    // error, Int should be String
    // c.intField = 1;
  }
}

Dynamic을 구현한다고 해서 다른 구현된 인터페이스의 요구 사항이 충족되는 것은 아니에요. 기대되는 필드는 여전히 명시적으로 구현해야 합니다.

참고(비-외부 클래스에서 Dynamic 구현) — Haxe 4부터는 extern 클래스에서만 Dynamic을 구현할 수 있어요. 이전 버전에서는 어떤 클래스든 Dynamic을 구현해 임의 필드를 읽거나 쓸 수 있었습니다. 또한 특별한 resolve 메서드로 존재하지 않는 필드의 읽기 접근을 해석할 수 있었어요. 비슷한 기능이 이제 추상 타입의 필드 접근 연산자 오버로드(operator overload)로 제공됩니다.

출처: Implementing Dynamic

본문

extern 클래스에서 Dynamic 구현

extern 클래스는 Dynamic이나 Dynamic<T>를 구현해 임의의 필드 접근을 허용할 수 있어요. Dynamic<String>을 구현하면 필드 값이 문자열로 제약됩니다. 아래 예제에서 c.intField = 1은 타입 오류가 되는 것이 그 이유예요.

Haxe 4의 제한

Haxe 4부터 Dynamic 구현은 extern 클래스로 제한됐어요. 이전에는 일반 클래스도 Dynamic을 구현할 수 있었고 resolve 메서드로 미존재 필드 접근을 처리할 수 있었지만, 지금은 추상 타입의 연산자 오버로드가 그 역할을 대신합니다.

더 알아보기