【发布时间】:2015-07-11 09:35:59
【问题描述】:
我想创建数据结构来捕捉以下想法:
在游戏中,我希望有一个通用的 Skill 类,它可以捕获技能 ID、冷却时间、法力消耗等一般信息。
然后我想拥有定义实际交互和行为的特定技能。所以这些都是从基类Skill扩展而来的。
最后,每个玩家都会有这些特定技能的实例,所以我可以查看每个玩家的技能状态,玩家最近是否使用过等等。
所以我有一个抽象超类Skill,它定义了一些所有技能共有的静态变量,然后对于扩展Skill 的每个单独技能,我使用一个静态块来重新分配静态变量。所以我有以下模式:
class A {
static int x = 0;
}
class B extends A {
static {
x = 1;
}
}
...
// in a method
A b = new B();
System.out.println(b.x);
上面打印出 1,这正是我想要的行为。我唯一的问题是系统抱怨我以非静态方式访问静态变量。但是我当然不能以这种方式访问它,因为我只想将技能视为Skill,而不知道它到底是哪个子类。所以我每次这样做时都必须抑制警告,这让我想到这里是否有更好/更整洁的设计模式。
我曾考虑过将相关变量设为非静态变量,但因为它们在特定技能的所有个实例中应该是静态的,所以我觉得它应该是一个静态变量...
【问题讨论】:
-
如果每个技能子类都有自己的 x 值,那么您应该在每个子类中都有一个静态的
x字段。照原样,加载 B 类会将 A.x 设置为 1。使您的 x 变量成为最终变量。如果您想以多态方式访问变量值,那么您应该在每个类中都有一个非静态的getX()方法。它是否总是返回相同的常量值是一个实现细节。 -
问题是...您不会更改特定技能的所有实例,而是更改所有技能的所有实例,因为您更改了
A类中的属性(我假设是您的 @ 987654330@班级)。因此,对于扩展A的所有类,x是1。我倾向于为您的技能使用接口,定义所需的方法并隐藏实现细节。您可以拥有某种public int getX()而无需关心实现。 -
这只是一个完整的旁白,但我会将这两件事完全分开:我有一个
SkillInfo类/枚举,其中包含有关技能的所有通用信息(名称、描述、先决条件等),技能不会扩展这个,每个都有一个实例。您可以创建单独的类来实现技能行为,每个技能对应一个。 -
好像连代码都不行!好吧,既然Java不允许覆盖静态方法,我想没有办法让这些共享变量成为静态的……
标签: java static subclassing