Thread overview
Interface abstraction
Jan 01, 2014
Frustrated
Jan 01, 2014
Adam D. Ruppe
Jan 01, 2014
Frustrated
Jan 01, 2014
Adam D. Ruppe
January 01, 2014
If I use interfaces instead of classes is there a way to have new return the underlying interface that I want it to?


interface A { }
class B : A {}

auto a = new B; // should return cast(A)(new B);

Maybe it's not such a big deal though? (I can't think of any case where a being of type B will hurt since it is always implicitly castable to type A.
January 01, 2014
On Wednesday, 1 January 2014 at 00:31:03 UTC, Frustrated wrote:
> auto a = new B; // should return cast(A)(new B);

A a = new B;

> case where a being of type B will hurt since it is always implicitly castable to type A.

Right, it'll always be usable anyway.
January 01, 2014
On Wednesday, 1 January 2014 at 00:31:58 UTC, Adam D. Ruppe wrote:
> On Wednesday, 1 January 2014 at 00:31:03 UTC, Frustrated wrote:
>> auto a = new B; // should return cast(A)(new B);
>
> A a = new B;
>
>> case where a being of type B will hurt since it is always implicitly castable to type A.
>
> Right, it'll always be usable anyway.

I guess I was thinking just for consistency since I'll always being trying to use interfaces instead of classes. I guess it's not a big deal though. In setting up little test units I'll end up using the classes and auto but probably not in the full project where I'll use factories and such.
January 01, 2014
On Wednesday, 1 January 2014 at 00:54:35 UTC, Frustrated wrote:
> not a big deal though. In setting up little test units I'll end up using the classes and auto but probably not in the full project where I'll use factories and such.

Yeah, if you use your own factory methods, you can always just have them return the interface.

Even as simple as:

InterfaceName make(Class, Args...)(Args args) { return new Class(args); }

which explicitly returns the interface, so if you did

auto a = make!Foo(10, 20); // a is typed to the interface