Thread overview
C# style generic interfaces with templates
Jan 15, 2007
Robby
Jan 15, 2007
Daniel Keep
Jan 15, 2007
Thomas Kuehne
Jan 15, 2007
Bradley Smith
Jan 15, 2007
Robby
January 15, 2007
Newish to D, so bare with me~

I have a few questions surrounding Class Templates and the like if anyone has time.

After reading the two pages on templates (lex, and revisited) I haven't seen anything regarding interfaces being templated like classes. However it doesn't produce a lexical error :

public interface H(T){
   T another();
}
public class A(T) : H!(T)
{
   T t;
   T another(){return t;}
   void curious(){}
}

What I'm aiming for is an equivalent to c#'s generic interfaces. So I can remove casting on my interface declarations.
However, when I do this :
 alias A!(int) a;
 assert(a.another()==0);

I get the following error : Error: need 'this' to access member another.

So, is there a way where I can template interfaces as I do classes to give a per type based interfaces to the classes?

Further on...

How do I get the A class instantiated? Is that possible with templated classes?

public class A(T)
{
	T t;
   	this(){}
}

 alias A!(int) a;
 a b = new a(); // doesn't work
 A! b = new A!(int)();// doesnt either?

 Am I wrong to think that I can use and approach class templates as if I were using generics in c#?
 Or am I going about it the wrong way?

January 15, 2007
Running out the door: this works for me with D 1.0:


interface H(T)
{
    T another();
}

class A(T) : H!(T)
{
    T t;
    T another() { return t; }
    void curious() { }
}

import std.stdio;

void main()
{
    alias A!(int) a;
    a b = new a;
    A!(int) c = new A!(int);
    H!(int) d = new A!(int);

    writefln("b.another: ", b.another);
    writefln("c.another: ", c.another);
    writefln("d.another: ", d.another);
}


	-- Daniel
January 15, 2007
Robby schrieb am 2007-01-15:
> Newish to D, so bare with me~
>
> I have a few questions surrounding Class Templates and the like if anyone has time.
>
> After reading the two pages on templates (lex, and revisited) I haven't seen anything regarding interfaces being templated like classes. However it doesn't produce a lexical error :
>
> public interface H(T){
>     T another();
> }
> public class A(T) : H!(T)
> {
>     T t;
>     T another(){return t;}
>     void curious(){}
> }
>
> What I'm aiming for is an equivalent to c#'s generic interfaces. So I
> can remove casting on my interface declarations.
> However, when I do this :
>   alias A!(int) a;
>   assert(a.another()==0);
>
> I get the following error : Error: need 'this' to access member another.

"a" is a type, not an instance:

# alias A!(int) a;
#
# int main(){
#    a b = new a();
#    assert(b.another() == 0);
#    return 0;
# }

> So, is there a way where I can template interfaces as I do classes to give a per type based interfaces to the classes?
>
> Further on...
>
> How do I get the A class instantiated? Is that possible with templated classes?
>
> public class A(T)
> {
> 	T t;
>     	this(){}
> }
>
>   alias A!(int) a;
>   a b = new a(); // doesn't work
>   A! b = new A!(int)();// doesnt either?

If the above code is at module level it will fail due to "new ..." being a non-constant expression:

# alias A!(int) a;
# a b;
# A!(int) c;
#
# static this(){
#    b = new a();
#    c = new A!(int)();
# }

Thomas


January 15, 2007
You almost had it right, but made a couple of minor coding mistakes.

> public interface H(T){
>    T another();
> }
> public class A(T) : H!(T)
> {
>    T t;
>    T another(){return t;}
>    void curious(){}
> }
> 
>  alias A!(int) a;
>  assert(a.another()==0);

In this code, "a" is a type not an object. I changed it to:
  alias A!(int) a;
  a aObject = new a;
  assert(aObject.another()==0);

> public class A(T)
> {
>     T t;
>        this(){}
> }
> 
>  alias A!(int) a;
>  a b = new a(); // doesn't work
>  A! b = new A!(int)();// doesnt either?

The last line is incorrect. I changed it to:
  A!(int) b2 = new A!(int)();

Hope that helps.

  Bradley
January 15, 2007
Sweet!, now I can port my collection classes to d without casting hell, thanks!

Robby

Bradley Smith wrote:
> You almost had it right, but made a couple of minor coding mistakes.
> 
>> public interface H(T){
>>    T another();
>> }
>> public class A(T) : H!(T)
>> {
>>    T t;
>>    T another(){return t;}
>>    void curious(){}
>> }
>>
>>  alias A!(int) a;
>>  assert(a.another()==0);
> 
> In this code, "a" is a type not an object. I changed it to:
>   alias A!(int) a;
>   a aObject = new a;
>   assert(aObject.another()==0);
> 
>> public class A(T)
>> {
>>     T t;
>>        this(){}
>> }
>>
>>  alias A!(int) a;
>>  a b = new a(); // doesn't work
>>  A! b = new A!(int)();// doesnt either?
> 
> The last line is incorrect. I changed it to:
>   A!(int) b2 = new A!(int)();
> 
> Hope that helps.
> 
>   Bradley