2016-08-23 4 views
6

Проблема заключается в следующем:Можно ли вызвать перегруженную функцию из функции перезаписи в Julia?

У меня есть абстрактный тип MyAbstract и производные сложные типы MyType1 и MyType2:

abstract MyAbstract 

type MyType1 <: MyAbstract 
    somestuff 
end 

type MyType2 <: MyAbstract 
    someotherstuff 
end 

Я хочу, чтобы указать некоторые общие поведение для объектов типа MyAbstract, поэтому у меня есть функция

function dosth(x::MyAbstract) 
    println(1) # instead of something useful 
end 

Это общее поведение достаточно для MyType1 но когда dosth является вызывается с аргументом типа MyType2, я хочу некоторые дополнительные вещи, чтобы случиться так, что являются специфическими для MyType2 и, конечно же, я хочу, чтобы повторно использовать существующий код, поэтому я попытался следующие, но это не сработало:

function dosth(x::MyType2) 
    dosth(x::MyAbstract) 
    println(2) 
end 

x = MyType2("") 
dosth(x) # StackOverflowError 

Это означает, что Джулия не признала мою попытку обработать x как ее «супертип» в течение некоторого времени.

Можно ли вызвать перегруженную функцию из функции перезаписи в Джулии? Как я могу изящно решить эту проблему?

ответ

6

Вы можете использовать invoke function

function dosth(x::MyType2) 
    invoke(dosth, (MyAbstract,), x) 
    println(2) 
end 

С теми же установками, что дает выход последующему вместо переполнения стека:

julia> dosth(x) 
1 
2 

Обсуждения можно найти here по замене или улучшения интерфейса до invoke. Мое предложение было бы сделать синтаксис очень близко к тому, что вы написали в вашем вопросе:

function dosth(x::MyType2) 
    @invoke dosth(x::MyAbstract) 
    println(2) 
end 

Если у вас есть какие-либо мысли о том, что более интуитивным имя, чем «ссылаться» было бы, пожалуйста, напишите комментарий ниже.

+1

Большое спасибо за ваш ответ! Я прочитал обсуждение, которое вы связали. Имя '@ calluper' будет выражать идею того, что я хочу делать очень хорошо. – esel

+0

Спасибо - это полезная обратная связь. Я думаю, что это лучшее имя. – StefanKarpinski

 Смежные вопросы

  • Нет связанных вопросов^_^