Julia:重写方法以添加功能

Julia:重写方法以添加功能,julia,overriding,Julia,Overriding,我想在具体类型中扩展抽象类型的方法。 我可以用一种新方法来实现,但这会带来更大的复杂性: abstract type AbstractTask end function complete(task::AbstractTask) complete_concrete_task(task) println("Done!") end struct Task <: AbstractTask name::String end complete_concre

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

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)
在Python中,我将使用
super
操作符。茱莉亚身上有类似的东西吗


提前谢谢

。但您可以使用超类型的选择方法:

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!
julia>抽象类型抽象任务结束
julia>函数完成(任务::AbstractTask)
println(“完成!”)
结束
完成(具有1个方法的泛型函数)
julia>struct Task complete(Task::Task)=(println(Task.name);invoke(complete,Tuple{AbstractTask},Task))
完成(具有2种方法的通用函数)
julia>编码=任务(“编码”)
任务(“编码”)
julia>完成(编码)
编码
完成!
当然,这要求您不要忘记将其添加到每个子类型方法中,这就是我所指的额外复杂性


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

这种方法有什么错?这似乎是正确的方法。使用
invoke
/
super
不是很习惯的用法。
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!