On Tuesday, 4 December 2012 at 12:26:53 UTC, Jacob Carlborg wrote:
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?

If you want to call toSring, it should be part of the interface specification, as simple as that.

Interfaces are like contracts which state what is to be expected of a certain type.

--
Paulo

Reply via email to