我要创建的数据结构来捕获以下思路:正在用静态块错误操作覆盖静态字段?
在一场比赛中,我希望有一个通用的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'中的属性(我认为它是你的'AbstractSkill'类)。因此对于所有扩展了'A'的类,'x'是'1'。我倾向于使用接口来提供技能,定义所需的方法并隐藏实现细节。你可以有一些'public int getX()'而不关心实现。 – Turing85
这只是一个完整的搁置,但我会完全分开这两件事:我有一个'SkillInfo'类/枚举,其中包含有关技能的所有通用信息(名称,描述,先决条件等) ,技能不会延伸,每个人都有一个实例。你可以创建独立的类来实现技能行为,每种技能一个。 – biziclop