朱莉娅:抽象类型的重写功能未调用

时间:2019-03-31 17:14:17

标签: julia

我正在使用Julia开发一个Provider程序包,该程序包将由多个Consumer程序包使用。以下是Provider软件包的Project结构的最小示例,以及一个用来复制问题的名为Consumer_A的样本Consumer软件包:

enter image description here

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函数”。在这种情况下,如何确保覆盖的具体类型函数被调用?

1 个答案:

答案 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