问题如下:
我有一个抽象类型MyAbstract
和派生的复合类型MyType1
和MyType2
:
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
视为&#34; supertype&#34;一段时间。
是否可以从Julia中的覆盖功能调用重载函数?我怎样才能优雅地解决这个问题?
答案 0 :(得分:8)
您可以使用invoke
function
function dosth(x::MyType2)
invoke(dosth, (MyAbstract,), x)
println(2)
end
使用相同的设置,这将提供跟随输出而不是堆栈溢出:
julia> dosth(x)
1
2
关于替换或改进invoke
的界面,可以找到here的讨论。我的提议会使语法与你在问题中写的非常接近:
function dosth(x::MyType2)
@invoke dosth(x::MyAbstract)
println(2)
end
如果您对更直观的名称有什么想法,而不是&#34;调用&#34;请在下面发表评论。