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

ese*_*sel 7 overloading abstract julia

问题如下:

我有一个抽象类型MyAbstract和派生的复合类型MyType1MyType2:

abstract MyAbstract

type MyType1 <: MyAbstract
    somestuff
end

type MyType2 <: MyAbstract
    someotherstuff
end
Run Code Online (Sandbox Code Playgroud)

我想为类型的对象指定一些一般行为MyAbstract,所以我有一个函数

function dosth(x::MyAbstract)
    println(1) # instead of something useful
end
Run Code Online (Sandbox Code Playgroud)

这种一般行为足以满足MyType1但是当dosth使用类型的参数调用时MyType2,我想要一些特定的其他事情MyType2,当然,我想重用现有的代码,所以我尝试了以下,但它没有用:

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

x = MyType2("")
dosth(x) # StackOverflowError
Run Code Online (Sandbox Code Playgroud)

这意味着朱莉娅x有一段时间没有认识到我试图像对待它的"超类型"一样.

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

Ste*_*ski 9

你可以使用这个invoke功能

function dosth(x::MyType2)
    invoke(dosth, (MyAbstract,), x)
    println(2)
end
Run Code Online (Sandbox Code Playgroud)

使用相同的设置,这将提供以下输出而不是堆栈溢出:

julia> dosth(x)
1
2
Run Code Online (Sandbox Code Playgroud)

可以在此处找到关于替换或改进接口的讨论invoke.我的建议会使语法与你在问题中写的非常接近:

function dosth(x::MyType2)
    @invoke dosth(x::MyAbstract)
    println(2)
end
Run Code Online (Sandbox Code Playgroud)

如果您对比"调用"更直观的名称有任何想法,请在下面发表评论.

  • 非常感谢您的回答!我阅读了您链接的讨论。名称`@ callsuper`表示我想做得很好的想法。 (2认同)