问题如下:
我有一个抽象类型MyAbstract
和派生的复合类型MyType1
and MyType2
:
abstract type MyAbstract end
struct MyType1 <: MyAbstract
somestuff
end
struct 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 中的覆盖函数调用重载函数?我怎样才能优雅地解决这个问题呢?
您可以使用invoke功能
function dosth(x::MyType2)
invoke(dosth, Tuple{MyAbstract}, x)
println(2)
end
使用相同的设置,这会给出以下输出,而不是堆栈溢出:
julia> dosth(x)
1
2
目前有一个内部和实验性的宏版本invoke
可以这样调用:
function dosth(x::MyType2)
Base.@invoke dosth(x::MyAbstract)
println(2)
end
这使得调用语法非常接近您编写的语法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)