Julia:重写方法以添加功能

Julia: Override method to add functionality

我想在具体类型中扩展抽象类型的方法。 我可以用一种新方法来做,但这会带来更多的复杂性:

abstract type AbstractTask end
function complete(task::AbstractTask)
    complete_concrete_task(task)
    println("Done!")
end

struct Task <: AbstractTask
    name::String
end
complete_concrete_task(task::Task) = println(task.name)
coding = Task("coding")
complete(coding)

在 Python 中,我会使用 super 运算符。 Julia 中是否有等效项?

提前致谢!

我会说,与调用 super 相比,以您的方式使用调度引入的 认知 复杂性要少得多。但是你可以使用超类型的 invoke select 方法:

julia> abstract type AbstractTask end

julia> function complete(task::AbstractTask)
           println("Done!")
       end
complete (generic function with 1 method)

julia> struct Task <: AbstractTask
           name::String
       end

julia> complete(task::Task) = (println(task.name); invoke(complete, Tuple{AbstractTask}, task))
complete (generic function with 2 methods)

julia> coding = Task("coding")
Task("coding")

julia> complete(coding)
coding
Done!

当然这要求你不要忘记将它添加到每个子类型方法中,这就是我的意思是额外的复杂性。

好处是 invoke 带有常量类型参数将被编译掉(或者我已经读过),所以调度甚至没有开销。