3

Fantom のオブジェクトを、実行時に選択した目的の型に動的にキャストしようとしています。

Type type := Int#
Obj n := 1 as Obj
echo((n as type).toStr)

これは簡単な例です。タイプをクラスに渡し、実行時に初期化したいと考えています。

4

1 に答える 1

3

簡単な答えは、動的な 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) )
于 2016-07-15T10:12:04.137 に答える