Трудно понять, что именно вы пытаетесь сделать именно с ограниченной информацией, но если вы откуда-то получаете кучу «запросов действий» и вам нужно, чтобы разные классы объектов обрабатывали их различными способами, вы сделать что-то вроде этого:
interface IActionHandler{
void HandleAction(Action action);
}
class Humanoid: IActionHandler{
void HandleAction(Action action){
switch(action.ActionType){
ActionType.Forward: Forward();
......
}
}
...
}
class Catcher: IActionHandler{
void HandleAction(Action action){
switch(action.ActionType){
ActionType.Grab: Grab();
......
}
}
...
}
class MainActionReceiver{
ReceiceActionRequest(Action action){
GetActioner(action.Actioner).HandleAction(action);
}
IActionHander GetActioner(string actioner){
if (actioner == "Humanoid"){
return humanoidObject;
}
return catcherObject;
}
}
Извините, в стиле semi-C # - это то, над чем я работаю сегодня.
Если вы хотите избежать оператора switch в функциях HandleAction, вы можете создать классы ActionExecuter для фактического выполнения таких действий:
Interface IExecuter<T>{
bool CanExecute(Action action)
void Execute(T owner, Action action);
}
Тогда есть
class ForwardExecuter<Humanoid>{
bool CanExecute{
return action.ActionType == forward;
}
Execute(Humaniod owner, Action action){
owner.Forward();
}
}
зарегистрирует доступные ActionExecuters с классами, а затем перебирает в обработчике в поиске исполнителя, который может выполнить действие, а затем передает его исполнителю.
class Humanoid: IActionHandler{
void HandleAction(Action action){
foreach (IExecuter in executers){
if (executer.CanExecute(action)){
executer.Execute(this, action);
}
}
}
...
}
Это вполне возможно излишне для того, что вы делаете, но тогда все ваши действия и исполнители действий будут полностью инкапсулированы в свои собственные классы.