Re: Arrays of many different (sub)classes

2010-04-25 Thread Ali Çehreli

Robert Clipsham wrote:

> interface I
> {
>   int foobar();
>   // The following line will cause an error when uncommented, as
>   // you cannot implement methods in an interface
>   // void baz() {}
> }

Just to be complete: interfaces can have static or final functions in D2:

static void baz() {}
final void baz_2() {}

Ali


Re: Arrays of many different (sub)classes

2010-04-25 Thread Robert Clipsham

On 25/04/10 14:47, Joseph Wakeling wrote:

Robert Clipsham wrote:

This should do what you want:


Thanks! :-)

Is it possible to do this with an interface instead of a base class?
I'm not familiar with how the former work ...

Best wishes,

 -- Joe


Yes it is, providing the base doesn't implement any methods, eg:


interface I
{
  int foobar();
  // The following line will cause an error when uncommented, as
  // you cannot implement methods in an interface
  // void baz() {}
}

class C : I
{
  int foobar() { return 1; }
}

class D : I
{
  int foobar() { return 2; }
}

import std.stdio;

void main()
{
  I[] arr;
  arr ~= new C;
  arr ~= new D;
  foreach( el; arr )
writefln( "%d", el.foobar() );
}

Prints:
1
2

You could also use an abstract class instead of an interface if you want 
to implement some of the methods.


Re: Arrays of many different (sub)classes

2010-04-25 Thread Mihail Strashun

On 04/25/2010 04:47 PM, Joseph Wakeling wrote:

Robert Clipsham wrote:

This should do what you want:


Thanks! :-)

Is it possible to do this with an interface instead of a base class?
I'm not familiar with how the former work ...

Best wishes,

 -- Joe




Re: Arrays of many different (sub)classes

2010-04-25 Thread Joseph Wakeling
Robert Clipsham wrote:
> This should do what you want:

Thanks! :-)

Is it possible to do this with an interface instead of a base class?
I'm not familiar with how the former work ...

Best wishes,

-- Joe


Re: Arrays of many different (sub)classes

2010-04-24 Thread Robert Clipsham

On 24/04/10 20:06, Joseph Wakeling wrote:

Hello all,

Occasionally in C++ I find it useful to build an array which contains
classes of multiple different types all using the same interface -- by
constructing an array of pointers to some common base class, e.g.

class BaseClass {
 // blah, blah ...
};

class A : BaseClass {
 // ... blah ...
};

class C : BaseClass {
 // ... blah ...
};

int main()
{
 vector  vec;
 vec.push_back(new A());
 vec.push_back(new C());
 // etc. etc.
}

(This code might be wrong; I'm just typing it to give the idea.  And in
practice, I usually do not use 'new' statements but pass pointers to
already-existing objects...:-)

Anyway, the point is that at the end of the day I have an array of
different objects with a common interface.  What's the appropriate way
to achieve the same effect in D?

Thanks&  best wishes,

 -- Joe


This should do what you want:

class BaseClass {
// blah, blah ...
}

class A : BaseClass {
// ... blah ...
}

class C : BaseClass {
// ... blah ...
}

int main()
{
BaseClass[] vec;
vec ~= new A;
vec ~= new C;
// etc. etc.
}



Arrays of many different (sub)classes

2010-04-24 Thread Joseph Wakeling
Hello all,

Occasionally in C++ I find it useful to build an array which contains
classes of multiple different types all using the same interface -- by
constructing an array of pointers to some common base class, e.g.

class BaseClass {
// blah, blah ...
};

class A : BaseClass {
// ... blah ...
};

class C : BaseClass {
// ... blah ...
};

int main()
{
vector vec;
vec.push_back(new A());
vec.push_back(new C());
// etc. etc.
}

(This code might be wrong; I'm just typing it to give the idea.  And in
practice, I usually do not use 'new' statements but pass pointers to
already-existing objects...:-)

Anyway, the point is that at the end of the day I have an array of
different objects with a common interface.  What's the appropriate way
to achieve the same effect in D?

Thanks & best wishes,

-- Joe