Как распространять информацию другим классам? - PullRequest
0 голосов
/ 31 января 2020

Предисловие

У меня есть обобщенный вопрос о том, как обращаться с двумя отдельными классами, которым требуется информация из одного из двух. Предположим, у нас есть 2 класса: A и B . Класс A будет классом, с которым взаимодействует клиент. Для простого случая давайте также скажем, что класс A является обобщенным сценарием, который дает что-то здоровье, а класс B является сценарием hitbox. Класс A имеет две переменные: число c здоровья и логическое значение для смерти. Класс B имеет один логический тип, если хитбокс может атаковать. Я выделю эти классы в C#.

Класс A

public class A{

   double health = 100;
   bool dead = false;

   public void damage(double amount){
      health -= amount;     
      if(health <= 0){
         health = 0;
         dead = true;
         //code to run after death...
      }
   }

}

Класс B

public class B{

   bool canHit = true;

   void Hit(){
      //do some hit code here...
   }   
}

Теперь предположим, что эти два класса должны работать вместе, поскольку они привязаны к одному игроку / врагу. Чтобы класс hitbox знал, что он больше не может ударить, он должен знать, что он мертв; Вот где мой вопрос вступает в игру.

Вопрос

Как я должен сообщить классу B , что он мертв, и какой путь лучший способ сделать это?

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

Решение 1

Класс A имеет ссылку на класс B , и там это функция в классе B , которая переключает логическое значение canHit в значение false. Эта функция вызывается, когда игрок умирает.

Решение 2

Класс B имеет ссылку на класс A . Всякий раз, когда хитбокс хочет попасть, он проверяет, мертв ли ​​класс A .

Я в основном пытаюсь выяснить, где у меня должна быть ссылка и как должна выполняться проверка. В этом сценарии я считаю, что Solution 1 лучше, потому что смерть вызывается один раз, и на все, что должно быть остановлено из-за смерти, можно просто сослаться и деактивировать все из класса A , тогда как решение 2 должно неоднократно проверять, может ли оно попасть или нет.

Опять же, это всего лишь конкретный c вариант использования, но я хотел бы получить некоторое представление о том, где должны быть ссылки и как изменить переменные классов на основе вхождений в других классах. Спасибо!

1 Ответ

0 голосов
/ 31 января 2020

Следуйте принципу единственной ответственности. Я собираюсь предположить, что класс B является хитбоксом, а класс А. игроком.

У игрока есть здоровье и хитбокс. Игрок может ударить только если они живы. Сам хитбокс не имеет понятия о живых или мертвых. Предположительно, он заботится только о своей позиции против позиции своей цели. Следовательно, игрок должен выполнять свою собственную проверку при попадании, а не выдавать это условие в поле попадания.

В принципе единой ответственности означает, что если класс не должен что-то делать, то не должен. Хитбокс, по-видимому, все еще может работать, если игрок мертв. Вопрос в том, разрешено ли игроку попадать во все, что является проблемой. В этом случае игрок должен выяснить это, а не хитбокс.

...