我需要从不同的类中更改多个Game1变量。我一直这样做:
public class Game1 : Microsoft.Xna.Framework.Game
{
public int test1;
public int test2;
}
public class Player
{
public Player(Game1 game)
{
game.test1 = 5;
game.test2 = 10;
}
}
这是不好的做法,如果是这样,还有其他办法吗?
答案 0 :(得分:8)
这是不好的做法,如果是这样,还有其他办法吗?
是和否。通常可以从一种类型中修改另一种类型的状态。
话虽如此,使用两个公共领域来做这件事我认为是不好的做法。至少应该将它们切换到属性。如果“test1”和“test2”是相关值,并且总是一起更改,则提供单个公共方法将适合设置这些。
如图所示,使用公共字段的缺点是您无法验证值。任何人(包括Player
)都可以将您的字段设置为不合适的值。如果您要共享代码,还会出现版本问题(例如,更改为属性是API更改)。
您希望其他类更改的任何状态(变量)应始终以您的类可以控制的方式公开。属性或方法允许您执行此操作。即使现在不需要这样做,设计未来也是一种更好的做法。
答案 1 :(得分:2)
我很高兴你没有使用单身人士,也没有使用static
。
传递对“父”对象的引用是非常好的做法:使依赖性变得清晰。
但是,我不建议只是在任何地方传递Game1
个引用。由于游戏在它们包含的对象方面通常相对较大/较复杂,因此它可以使每个对象的依赖性/预期访问不清楚(因为现在每个对象都可以触及游戏中的所有内容)。从逻辑上将对象拆分为父容器有时更有意义:
public class Game1
{
public readonly PlayerData playerData;
public readonly EnemyData enemyData;
//...
}
通过这些容器进行更严格控制的访问。同样取决于您的范围/尺寸。
答案 2 :(得分:0)
根据您的要求,另一个选项可能是将这些变量存储在静态类中,作为静态对象。只要它们属于同一个项目,就可以从所有类中访问它们。
例如:
public static class Helper
{
public static int test1;
public static int test2;
}
用法:
public class Player
{
public Player()
{
Helper.test1 = 5;
Helper.test2 = 10;
}
}
答案 3 :(得分:0)
它反对information hiding,这是OOP的基本原则之一。一般来说,一个班级应该负责管理自己的国家,而不是委托,或者更糟糕的是,与他人分担这一责任。这只是一个指导原则,应该遵循适当的判断。
在摘要中,这是你要支付的罚款:
OOP就是将复杂的流程划分为单独的角色,这些角色可以单独轻松推理。公共状态意味着共享状态,角色之间共享的越多,它们就越模糊。
有些公共领域可以理解。例如,一个简单的3D Point类可能如下所示:
class Point { public int X; public int Y; public int Z; }
这没关系,因为该类没有任何内部逻辑;它只是一个容器,它只包含这三个密切相关的值。这种类的一个例子是XNA中的Vector2 class,它将其状态(X和Y)公开为公共字段。