是否可以通过Julia中的覆盖功能调用重载函数?

时间:2016-08-23 13:10:23

标签: julia abstract overloading

问题如下:

我有一个抽象类型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视为&#34; supertype&#34;一段时间。

是否可以从Julia中的覆盖功能调用重载函数?我怎样才能优雅地解决这个问题?

1 个答案:

答案 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;请在下面发表评论。