Как мне избежать повторяющихся операторов if, не прерывая event для выполнения других действий?

#c# #unity3d #events

#c# #unity3d #Мероприятия

Вопрос:

В этой проблеме взаимодействуют два класса. Я хотел бы отметить, что я использую Unity:

  1. Обработчик задач
 public class TaskHandler{

    public event Action<GameObject> TaskResponses;

    private void Update(){
        if (someCondition){
            TaskResponses?.Invoke(taskObj);
        }
    }
}
 
  1. База задач
 public class TaskBase: MonoBehaviour{

    private TaskHandler taskHandler;

    private void Start(){
        taskHandler = gameObject.GetComponent<TaskHandler>();
        taskHandler.TaskResponses  = TaskResponse;
    }

    private void TaskResponse(GameObject taskObj){
        //if check so that only specific TaskResponses run.
        if (taskObj == gameObject){
                //functions
            }
    }

}
 

Проблема, с которой я сталкиваюсь, связана с методами, которые расширяются TaskResponse() .

 public class SpecificTask{

    public override void TaskResponse(GameObject taskObj)
    {
        base.TaskResponse(taskObj);

        //another if check
        if (taskObj == thisTaskObj){
            //some other functionality
        }
    }
}
 

Я не хочу делать еще if одну проверку. Я попробовал следующее:

 public class TaskBase: MonoBehaviour{
    //Start() method omitted

    private void TaskResponse(GameObject taskObj){
        //if check so that only specific TaskResponses run.
        if (taskObj == gameObject){
                //functions
            }
        else{
            //Effectively stops code from SpecificTask to continue running,
            //But other Actions are no longer called.
            return;
        }
    }

}
 

Но return оператор останавливается TaskReponses() из других классов для запуска. Под этим я подразумеваю, что если бы у меня был класс Task1 and Task2 , и Task1 ‘s TaskResponse() запускается первым, но он запускает оператор else , он останавливается и не запускает Task2 ‘s TaskResponse() .

Как я могу улучшить свой код, чтобы прекратить писать повторяющиеся if проверки, в то время как мой код проверяет все Action так, как я хочу? Должен ли я вообще не использовать event этот сценарий?

Спасибо!

Ответ №1:

Вы могли бы сделать это не void так, а скорее bool , что указывает, был ли метод успешно завершен или прерван, например,

 public class TaskBase
{
    public virtual bool TaskResponse(GameObject taskObj)
    {
        if(taskObj != thisObj) return false;

        // Default stuff to happen

        return true;
    }
}
 

Тогда вы можете сделать

 public class MyTask
{
    public override bool TaskResponse (GameObject taskObj)
    {
        if(!base.TaskResponse(taskObj)) return false;

        // Default stuff already happened
        // Now you can add additional stuff here

        return true;
    }
}
 

В качестве альтернативы, если вы хотите полностью избежать этой if проверки, я также часто использую отдельные методы, такие как

 public class TaskBase
{
    public void TaskResponse (GameObject taskObj)
    {
        if(taskObj != thisObj) return;

        TaskResponseInternal();
    }

    protected virtual void TaskResponseInternal() 
    {
        // Default stuff to happen
    }
}
 

А затем просто переопределите это вместо этого

 public class MyTask
{
    protected override void TaskResponseInternal ()
    {
        // If you want also the default stuff
        base.TaskResponseInternal();

        // Additional stuff to happen
    }
}
 

Комментарии:

1. Я плохо сформулировал свой вопрос и объяснил его. Я обновил вопрос, чтобы предоставить более подробную информацию. Проблема, с которой я столкнулся, заключается в том, что я попробовал return; это утверждение, но оно останавливает запуск other TaskResponse() in the event.