Array/list of objects of different type but with same interface
Ali Çehreli
acehreli at yahoo.com
Wed Jun 20 14:14:10 PDT 2012
On 06/20/2012 02:01 PM, Joseph Rushton Wakeling wrote:
> What I'm puzzling over is how to effectively store the collection of
> agents. These will be arbitrary in number (and agents might in principle
> be created or destroyed during the game), will all have the same
> interface, but will have different implementations -- some may use
> look-up tables, some may be controlled by neural networks, etc. etc.
>
> When I originally wrote this in C, I just used an array of pointers to
> agents. In C++ I did something similar, defining an agent class of which
> all implementations were subclasses.
>
> I'm just wondering what might be the best and most idiomatic way to do
> this in D. My likely agent design will be a "policy class" style,
>
> struct Agent(alias X, alias Y, ...)
> {
> mixin X;
> mixin Y;
> // etc...
> }
>
> ... with template mixins to implement the individual components that
> vary by agent type. The public interface will be identical for all
agents.
>
> What I can't work out is how to store a collection of these agents in an
> array or similarly efficient container. Can anyone advise?
Sounds like you need an 'interface' and classes that implement it. The
following code uses simple string mixins:
import std.stdio;
interface Agent
{
double trade();
}
class SmartAgent : Agent
{
double trade()
{
writeln("Trading smartly");
return 42;
}
}
class ConfigurableAgent(string X, string Y) : Agent
{
mixin(X);
mixin(Y);
double trade()
{
writefln("Trading with type '%s' and '%s'", typeid(x), typeid(y));
return x + y;
}
}
void main()
{
Agent[] agents;
agents ~= new SmartAgent();
agents ~= new ConfigurableAgent!("int x;", "int y;");
agents ~= new ConfigurableAgent!("double x;", "long y;");
foreach (agent; agents) {
agent.trade();
}
}
Ali
More information about the Digitalmars-d-learn
mailing list