Hi Leah, Thank you very much! This exactly solve my issue here.
Best, Chiyuan On Sunday, January 12, 2014 12:11:39 AM UTC+8, Leah Hanson wrote: > > Hi Chiyuan, > > The problem is that your myfunc outside the module is shadowing the name > myfunc, rather than extending it. In order to avoid accidental naming > collisions, you have to tell Julia when you're intentionally extending a > function from another module with new methods. > > You have two syntax options to indicate that you're extending Foo's myfunc: > > 1. Add the line `import Foo.myfunc`. This will mean any `myfunc` defined > in the current module will extend Foo's myfunc. If you export myfunc from > Foo, then I believe that you don't need the `Foo.` part. > > 2. Declare the function as `Foo.myfunc`. By which I mean: > function Foo.myfunc(a::TSub) > @printf "override function is called\n" > end > > Hope this helps, > Leah > > > On Sat, Jan 11, 2014 at 4:48 AM, Chiyuan Zhang <[email protected]<javascript:> > > wrote: > >> Hi all, >> >> I'm trying to implement something that allows user to derive a new type >> from my abstract type and also add new behavior to the methods operating on >> those new types. For example, the following code snippet: >> >> >> ---------------------------------------------x------------------------------------- >> module Foo >> >> abstract TBase >> >> function myfunc(a::TBase) >> @printf "base function is called\n" >> end >> >> function invoke(a::TBase) >> myfunc(a) >> end >> >> export TBase >> #export myfunc >> export invoke >> >> end >> >> >> >> using Foo >> >> type TSub <: TBase >> end >> >> function myfunc(a::TSub) >> @printf "override function is called\n" >> end >> >> foo = TSub() >> invoke(foo) >> ---------------------------------x--------------------------------- >> >> my intention is that when user call "invoke" with a subtype, the "myfunc" >> defined for this subtype should be called. Everything works fine if I >> didn't put my internal stuff inside a module. However, after I put my stuff >> in a module, it doesn't work: only the original base method is called. I >> have tried to export "myfunc" or not, but it doesn't change. >> >> Can anyone point me out how should I work around this or what is the >> correct way of doing this? I suppose this is a quite common scenario as in >> traditional OOP, we allow the user to provide derived type with customized >> behavior on that type. >> >> Best, >> Chiyuan >> > >
