Юлия: Переопределенная функция абстрактного типа не вызывается - PullRequest
0 голосов
/ 31 марта 2019

Я разрабатываю пакет Provider в Julia, который будет использоваться несколькими пакетами Consumer. Ниже приведен минимальный пример структуры проекта для пакета Provider и пример пакета для потребителя под названием Consumer_A для воспроизведения проблемы:

enter image description here

Файл generic.jl в пакете Provider определяет абстрактный тип AbstractDataLoader с функцией load_data. Эта функция переопределена в конкретном типе CustomDataLoader, определенном в файле custom_implementation.jl в пакете Consumer_A, как показано ниже:

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() я получаю сообщение об ошибке «Не определена функция load_data для CustomDataLoader», которое возникает в функции generic.jl load_data. Как убедиться, что в этом случае вызывается переопределяющая функция конкретного типа?

1 Ответ

0 голосов
/ 31 марта 2019

В 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
...