2016-08-23 22 views
6

問題は以下の通りです:Juliaの上書き機能からオーバーロードされた関数を呼び出すことはできますか?

私は抽象型MyAbstractを持っており、複合型MyType1MyType2を派生:

abstract MyAbstract 

type MyType1 <: MyAbstract 
    somestuff 
end 

type MyType2 <: MyAbstract 
    someotherstuff 
end 

私はタイプMyAbstractのオブジェクトのためのいくつかの一般的な動作を指定したいので、私は持っています機能

function dosth(x::MyAbstract) 
    println(1) # instead of something useful 
end 

この一般的な動作はMyType1で十分しかしdosthがあるとき私はMyType2に特異的で起こるためにいくつかの追加のことをしたい、タイプMyType2の引数で呼び出されて、もちろん、私は、既存のコードを再利用したいので、私は次のことを試してみましたが、それはうまくいきませんでした:

function dosth(x::MyType2) 
    dosth(x::MyAbstract) 
    println(2) 
end 

x = MyType2("") 
dosth(x) # StackOverflowError 

これは、ジュリアがxをその「スーパータイプ」のように扱う試みをしばらく認識していないことを意味します。

Juliaの上書き機能からオーバーロードされた関数を呼び出すことはできますか?どうすればこの問題をエレガントに解決できますか?

答えて

6

あなたは同じ設定でinvoke function

function dosth(x::MyType2) 
    invoke(dosth, (MyAbstract,), x) 
    println(2) 
end 

を使用することができ、これは代わりに、スタックオーバーフローのフォローの出力が得られます。

julia> dosth(x) 
1 
2 

ディスカッションは、インターフェースを交換したり、改善にhereを見つけることができますinvoke。私の提案は、あなたの質問に書いたものに構文が非常に近くなるだろう:

function dosth(x::MyType2) 
    @invoke dosth(x::MyAbstract) 
    println(2) 
end 

あなたは次のようになり、「起動」よりも何より直感的な名前上の任意の考えを持っている場合は、以下のコメントを投稿してください。

+1

ありがとうございました。私はリンクした議論を読みました。 '@ callsuper'という名前は、私がうまくやりたいことを表現しています。 – esel

+0

ありがとう - それは役に立つフィードバックです。私はそれがこれまで最高の名前だと思う。 – StefanKarpinski

関連する問題