我正在使用Julia开发一个Provider程序包,该程序包将由多个Consumer程序包使用。以下是Provider
软件包的Project结构的最小示例,以及一个用来复制问题的名为Consumer_A
的样本Consumer软件包:
Provider软件包中的文件generic.jl定义了具有函数AbstractDataLoader
的抽象类型load_data
。在Consumer_A包的文件custom_implementation.jl中定义的具体类型CustomDataLoader
中,此函数被覆盖,如下所示:
generic.jl:
export DataProcessor, process_data
abstract type AbstractDataLoader end
function load_data(data_loader::AbstractDataLoader)
error("No load_data function defined for $(typeof(data_loader))")
end
struct DataProcessor end
function process_data(data_loader::AbstractDataLoader)
data = load_data(data_loader)
println("do some processing after loading data: $data")
end
custom_implementation.jl:
import Provider
export CustomDataLoader, load_data
struct CustomDataLoader <: Provider.AbstractDataLoader end
function load_data(data_loader::CustomDataLoader)
return "sample data"
end
main.jl文件具有一个main
函数,该函数实例化具体类型并调用方法process_data
,而该方法又应理想地调用覆盖函数:
using Provider
export main
function main()
data_loader = CustomDataLoader()
data_processor = DataProcessor()
process_data(data_loader)
end
但是,相反,在运行main()
时,我收到了generic.jl load_data
函数中引发的错误“未为CustomDataLoader定义load_data函数”。在这种情况下,如何确保覆盖的具体类型函数被调用?
答案 0 :(得分:0)
在custom_implementation.jl中,我尝试将function load_data
替换为function Provider.load_data
,因为我想覆盖该定义时使用的是语句import Provider
而不是using Provider
。进行此更改后,它可以正常工作,并且调用了覆盖函数!
更新后的custom_implementation.jl现在是:
import Provider
export CustomDataLoader, load_data
struct CustomDataLoader <: Provider.AbstractDataLoader end
function Provider.load_data(data_loader::CustomDataLoader)
return "sample data"
end