Fantom のオブジェクトを、実行時に選択した目的の型に動的にキャストしようとしています。
Type type := Int#
Obj n := 1 as Obj
echo((n as type).toStr)
これは簡単な例です。タイプをクラスに渡し、実行時に初期化したいと考えています。
簡単な答えは、動的な invoke を使用すること、つまり->
の代わりに使用することです.
。メソッドが存在することがわかっている場合は、型を知る必要さえありません。
n := (Obj) 1
echo( n->toStr() )
しかし、より一般的には、提案したように動的にキャストすることはできません。type
コンパイル時に何がわからない場合、コンパイラはどのように知る必要があるのでしょうか!?
通常n
、親スーパータイプで定義されたメソッドを実装し、そのスーパータイプにキャストn
して、通常どおりメソッドを呼び出します。
myObj := ...
n := (Supertype) myObj
n.myMethod()
ただし、共通の親型がない場合は、動的呼び出しが適しています。
...またはリフレクションを使用してください! それはFantomのらくらくです:
n := (Obj) 1
method := n.typeof.method("toStr")
echo( method.callOn(n, null) )