2016-08-23 25 views
6

Vấn đề là như sau:Có thể gọi hàm quá tải từ chức năng ghi đè trong Julia không?

Tôi có một loại trừu tượng MyAbstract và nguồn gốc các loại composit MyType1MyType2:

abstract MyAbstract 

type MyType1 <: MyAbstract 
    somestuff 
end 

type MyType2 <: MyAbstract 
    someotherstuff 
end 

tôi muốn chỉ định một số hành vi chung của các đối tượng của loại MyAbstract, vì vậy tôi có một chức năng

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

Hành vi chung này đủ cho MyType1 nhưng khi dosth là gọi với một đối số kiểu MyType2, tôi muốn có một số điều bổ sung để xảy ra trường hợp cụ thể cho MyType2 và, tất nhiên, tôi muốn sử dụng lại mã hiện, vì vậy tôi cố gắng điều sau đây, nhưng nó đã không làm việc:

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

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

Điều này có nghĩa là Julia không nhận ra nỗ lực của tôi đối xử với số x giống như "siêu kiểu" của nó một thời gian.

Có thể gọi hàm quá tải từ chức năng ghi đè trong Julia không? Làm cách nào tôi có thể giải quyết vấn đề này một cách thanh lịch?

Trả lời

6

Bạn có thể sử dụng invoke function

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

Với cùng một thiết lập, điều này sẽ cho kết quả sau thay vì một stack overflow:

julia> dosth(x) 
1 
2 

thảo luận có thể được tìm thấy here về thay thế hoặc cải thiện giao diện đến invoke. Xét đề nghị của tôi sẽ thực hiện cú pháp rất gần với những gì bạn đã viết trong câu hỏi của bạn:

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

Nếu bạn có bất kỳ suy nghĩ về những gì một tên trực quan hơn "gọi" sẽ là, xin vui lòng viết bình luận dưới đây.

+1

Cảm ơn bạn rất nhiều vì câu trả lời của bạn! Tôi đọc vào cuộc thảo luận bạn đã liên kết. Cái tên '@ callsuper' sẽ thể hiện ý tưởng của những gì tôi muốn làm rất tốt. – esel

+0

Cảm ơn - đó là phản hồi hữu ích. Tôi nghĩ đó là tên tốt nhất cho đến nay. – StefanKarpinski

Các vấn đề liên quan