Interfaces, traits, concepts, and my idea for a DIP

jmh530 via Digitalmars-d digitalmars-d at puremagic.com
Tue Jul 28 07:38:22 PDT 2015


On Tuesday, 28 July 2015 at 13:23:37 UTC, Daniel Kozák wrote:
>
> I would use something like this:
>
> @interface(InputRange, ...)
> struct MyRange { ... }
>
>
> @interface(InputRange, ...)
> class MyClassRange { ... }

I get the change from isInputRange to InputRange, because 
isInputRange is like a templated bool or something and InputRange 
is an interface. But why the suggestion of user-defined 
attributes?

As an aside, I'm still trying to understand the reasoning behind 
some of the decisions around structs and inheritance. The big 
difference between structs and classes is that structs are value 
types and classes are reference types. I'm not entirely sure on 
all the implications of that. My guess is that it helps to know 
how big a value type is in advance (at compilation). So if you're 
inheriting virtual methods in a struct, then you won't 
necessarily know how big it will be and that can be problem. 
However, I would think that final and static methods wouldn't be 
an issue.

Coming around to interfaces, they only allow virtual methods 
without implementation, plus final and static methods. I would 
think the last two would work fine with structs because they 
should be known at compile time, so the only part I'm not sure 
about is the way the virtual methods without implementation would 
work. It seems like to implement what the OP is suggesting you'd 
need some separate rule for handling struct inheritance of 
interfaces so that they are not virtual in the same manner as 
they would be for classes.


More information about the Digitalmars-d mailing list