首页 > 解决方案 > 如何向其他类传播信息?

问题描述

前言

我有一个关于如何处理两个需要来自两者之一的信息的单独类的一般性问题。假设我们有 2 个类,AB。A 类是客户端与之交互的类。举个简单的例子,假设A类是一个通用脚本,可以提供健康,而B类是一个 hitbox 脚本。A类有两个变量,一个数字健康和一个表示死亡的布尔值。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类。每当 hitbox 想要命中时,它都会检查A类是否已死亡。

我主要是想弄清楚我应该在哪里参考以及应该如何进行检查。在这种情况下,我认为解决方案 1更好,因为死亡被触发一次,并且由于死亡而必须停止的任何东西都可以从A类中全部引用和停用,而解决方案 2必须反复检查它是否可以命中.

同样,这只是一个特定的用例,但我想了解引用应该在哪里以及如何根据其他类中的出现来更改类的变量。谢谢!

标签: oopreference

解决方案


遵循单一责任原则。我将假设 B 类是一个碰撞盒,A 类是玩家。

玩家有生命值和一个碰撞箱。玩家只有在活着的情况下才能击中。hitbox 本身没有死或活的概念。据推测,它只关心它的位置与目标的位置。因此,玩家应该在击球时执行自己的检查,而不是将条件传递给 hitbox。

单一职责原则意味着如果一个类不需要做某事,那么它就不应该做。如果玩家死了,hitbox 可能仍然可以运行。问题在于是否允许玩家击中任何东西。在这种情况下,解决这个问题是玩家的责任,而不是 hitbox 的责任。


推荐阅读