Я бы перечислил все имеющиеся у вас функции и затем создал бы класс набора функций, который выполняет функцию, связанную с перечислением:
public class FunctionSet
{
public enum FuncName
{
MOVE_RANDOM,
SHOOT,
GO_HOME,
...
}
public FunctionSet()
{
}
public void Execute(FuncName funcName, Soldier soldier, SoldierWorld world)
{
switch(funcName)
{
case FuncName.MOVE_RANDOM:
soldier.moveRandom(world);
break;
case FuncName.SHOOT:
soldier.shoot(...);
break;
case FuncName.GO_HOME:
soldier.goHome(...);
break;
default:
break;
}
}
}
Таким образом, узлы в вашем дереве выражений теперь не будут содержать фактическую функцию, а только перечисления FuncName
... возможно, вам придется проделать дополнительную работу, например, отслеживать, сколько параметров связано с каждой функцией и поместите это в хэш-карту.
В качестве альтернативы вы можете использовать отражение, чтобы получить все применимые имена функций из класса Soldier
и затем разместить их на карте с соответствующим числом параметров.