Forum: IronRuby Problem calling explicit interface methods

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Alex 2. (Guest)
on 2009-01-08 12:25
Hello,

I am trying to call explicitly implemented interface method, but get
such error
  undefined method `bar' for #<App::Cls:0x000005c>

C# code:

    public interface IFoo
    {
        void Bar();
    }

    public class Cls : IFoo
    {
        void IFoo.Bar() { }
    }

Ruby code:
    x = App::Cls.new
    x.bar


But this one works fine:

    public class Cls : IFoo
    {
        public void Bar() { }
    }

What is wrong?

- Alex
Tomas M. (Guest)
on 2009-01-08 17:56
(Received via mailing list)
Filed bug #23494.

Tomas
Curt H. (Guest)
on 2009-01-08 18:18
(Received via mailing list)
I'm not convinced this is exactly a bug.  There is no public 'bar'
method on Cls after all.  I think IronPython would require you to say
something like App::IFoo::bar(App::Cls.new()) in order to make the
interface call explicit.
Alex 2. (Guest)
on 2009-01-08 18:53
Curious, how it is expected to work (or nobody thinked it over yet?)

Example to consider:

    - - - -
    public interface IFoo1
    {
        void Bar();
    }

    public interface IFoo2
    {
        void Bar();
    }

    public class Cls : IFoo1, IFoo2
    {
        void IFoo1.Bar() {}
        void IFoo2.Bar() {}
        public void Bar() {}
    }
    - - - -

C# approach:
    - - - -
    Cls obj = new Cls();
    obj.Bar();
    ((IFoo1)obj).Bar();
    ((IFoo2)obj).Bar();
    - - - -

What is for IronRuby?

Thanks,
 - Alex
Tomas M. (Guest)
on 2009-01-08 18:54
(Received via mailing list)
Fair enough, it could be called a feature :) There needs to be some way
how to call the method.

Tomas
Tomas M. (Guest)
on 2009-01-08 20:02
(Received via mailing list)
Not yet.

obj.as(IFoo1).Bar() might be one option.

Tomas
Shri B. (Guest)
on 2009-01-08 20:12
(Received via mailing list)
In IronPython, we went back and forth over this. On the one hand, the
API author might have chosen to make it harder to access the method,
requiring a cast like this:
  App::Cls cls = new App::Cls();
  cls.bar(); // syntax error
  IFoo ifoo = (IFoo)cls;
  ifoo.bar(); // works
OTOH, dynamic languages have no type for variables, and so you don't
know if it should be an error or not. ie. How would IronRuby know if the
programmer expects a variable to be of type App::Cls or of type IFoo.

IronPython ended up allowing it as long as there was no clash. If there
is a clash, you have to use App::IFoo(cls).bar().

Thanks,
Shri
This topic is locked and can not be replied to.