https://issues.dlang.org/show_bug.cgi?id=14612

--- Comment #4 from Rainer Schuetze <r.sagita...@gmx.de> ---
> And you can do the latter behavior by typeid(cast(Object)obj).
> I feel that syntactic cost is enough small.

cast(Object) creates a call into the runtime (_d_interface_cast) and is pretty
expensive. It could be optimized to the series of indirections by the compiler,
though.

> In short, the orthogonality may have been priority than the intuitive, but 
> complex behavior.

The "complex" behaviour costs just an additional reading of an offset to the
object base address, very much what a thunk does when calling a virtual
function.

I guess the current behaviour could be described as "typeid(I) evaluates to the
most derived interface that is implemented by the object and that inherits from
the static type."

But "most derived" is not well defined when it comes to inheriting from
multiple interfaces:

import std.stdio;

interface I {}
interface J : I {}
interface K : I {}
class E : J, K {}

void main()
{
    E e = new E;
    J j = e;
    K k = e;
    I ij = j;
    I ik = k;
    writeln(typeid(ij));      // prints 'test.J' !?
    writeln(typeid(ik));      // prints 'test.K' !?
}

--

Reply via email to