2.6.2 Dynamic 구현하기(Implementing Dynamic)
2.6.2 Dynamic 구현하기(Implementing Dynamic)
외부(extern) 클래스는 Dynamic과 Dynamic<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)로 제공됩니다.
본문
extern 클래스에서 Dynamic 구현
extern 클래스는 Dynamic이나 Dynamic<T>를 구현해 임의의 필드 접근을 허용할 수 있어요. Dynamic<String>을 구현하면 필드 값이 문자열로 제약됩니다. 아래 예제에서 c.intField = 1은 타입 오류가 되는 것이 그 이유예요.
Haxe 4의 제한
Haxe 4부터 Dynamic 구현은 extern 클래스로 제한됐어요. 이전에는 일반 클래스도 Dynamic을 구현할 수 있었고 resolve 메서드로 미존재 필드 접근을 처리할 수 있었지만, 지금은 추상 타입의 연산자 오버로드가 그 역할을 대신합니다.