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
带有常量类型参数将被编译掉(或者我已经读过),所以调度甚至没有开销。
我想在具体类型中扩展抽象类型的方法。 我可以用一种新方法来做,但这会带来更多的复杂性:
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
带有常量类型参数将被编译掉(或者我已经读过),所以调度甚至没有开销。