typeid() broken for interfaces?

Jacob Carlborg doob at me.com
Tue Dec 4 04:26:52 PST 2012


On 2012-12-04 09:22, Maxim Fomin wrote:

> And what happens if nobody implements an interface?
>
> import std.stdio;
>
> interface I { }
>
> class A { }
>
> void main()
> {
>      I i;
>      // assume this is implicit
>      Object o = cast(Object)i;
>      writeln(typeid(o));
> }

You get a segmentation fault since both "i" and "o" are null.

> Safe conversion class to interface requires two conditions:
> 1a) that class implements interface
> 1b) if you try to use interface variable, it must be an allocated class
> instance
>
> Safe conversion to Object requires:
> 2a) somebody in class hierarchy implements interface
> 2b) interface instance is actually allocated class instance

You cannot really get an instance of an interface without having a class 
implementing it. That is, without inserting any explicit casts, which works:

interface I { }

class A { }

void main()
{
     A a = new A;
     I i = cast(I) a;
     Object o = cast(Object)i;
     writeln(typeid(a)); // A
}

> It is possible to check 1a) but impossible in general case to check 2a).
> Also the first is design feature while the second is design abuse.

I don't understand why it wouldn't be safe to allow implicit casts of 
interfaces to Object.

If I want to call toString, why should I need to insert an explicit cast 
to Object just because I have an interface?

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list