First Steps: Dynamic class instantiation

Kyle Furlong kylefurlong at gmail.com
Sun Jan 28 04:02:15 PST 2007


Kevin Bealer wrote:
> Thomas wrote:
>> Hi
>>
>> I'm just making my first steps to understand D, and sometimes I'm a 
>> little bit offroad as I do not know C/C++, just PHP, Javascript etc.
>>
>> I would like to write a small shell application with a small bundle of 
>> functionalities. As a first step, the user must choose which function 
>> to use (I already got that part). Than she must enter some information 
>> for the function to work on.
>>
>> I thought of doing this by creating classes for each functionality 
>> implementing the same interface and creating an array in main() that 
>> somehow refers to these classes. There the trouble starts.
>>
>> I don't know how to create such an array, and of which type it has to 
>> be. To be more specific, I provide you with a PHP example of what I 
>> want to do:
>>
>> $selected = 1;
>> $classes = array('class1','class2');
>> $className = $classes[$selected];
>> $object = new $className;
>>
>> Thanks for any help.
>>
>> Thomas
> 
> (This probably goes in D.learn by the way.)
> 
> If you have a class that follows a common interface (I'll call it 
> Command) you could do this:
> 
> class Command {
>     static Command[char[]] actions;
> 
>     this(char[] name)
>     {
>          actions[name] = this;
>     }
> 
>     static void run(char[] name, char[] arguments)
>     {
>         assert(name in actions);
>         actions[name].work(arguments);
>     }
> 
>     abstract void work(char[] arguments);
> };
> 
> Then you can create instance of Command:
> 
> class Rename : Command {
>     this()
>     {
>         super("rename");
>     }
> 
>     void work(char[] arguments)
>     {
>         // do a rename or something
>     }
> };
> 
> If you create one object of each subclass:
> 
> Rename r = new Rename;
> 
> The calling code could do this:
> 
> Command.run("rename", "a b");
> 
> Which would run the Rename.work() command.
> 
> Kevin

Wow, that is an effective solution, never seen that pattern before.



More information about the Digitalmars-d mailing list