gpt4 book ai didi

java - 没有getClass()如何区分Java中的相似对象?

转载 作者:行者123 更新时间:2023-11-30 06:57:37 31 4
gpt4 key购买 nike

我正在用 Java 制作一个简单的游戏,我认为我有一个设计问题。我有一个抽象类 Unit,它具有所有单位的行为(如 move()、attack()、getHealth() 等)。然后我从 Unit 扩展了三个类:Archer、Lancer、Rider。它们中的每一个都只有一个构造函数来区分它们,因为它们的行为方式完全相同,但具有不同的统计数据。

public class Archer extends Unit {    
public Archer(World world, Location location, Player owner) {
super(new Attack(1, 6, 1), new Defense(1, 4, 2), 10, 4, location, owner);
}
}

public class Lancer extends Unit {
public Lancer(World world, Location location, Player owner){
super(new Attack(2, 2, 5), new Defense(3,2,3), 15, 5, location, owner);
}
}

public class Rider extends Unit{
public Rider(World world, Location location, Player owner) {
super(new Attack(3, 2, 4), new Defense(2,4,1), 15, 7, location, owner);
}
}

问题来了。我希望能够打印具有不同 Sprite 的那些单元,所以我制作了具有每个 Sprite 的 ArcherUI、LancerUI 和 RiderUI 类。但是,我如何告诉程序打印一个弓箭手?

一个解决方案可能是为每个单元执行一个 getClass(),但这不是一个好的解决方案,因为我想要一个好的面向对象设计。

我想到的另一个选择是为单元添加一个名称:

public class Archer extends Unit {  
String name = "archer";
public Archer(World world, Location location, Player owner) {
super(new Attack(1, 6, 1), new Defense(1, 4, 2), 10, 4, location, owner);
}
}

但随后比较此 String 将与生成 getClass() 相同。我能做些什么?有什么想法吗?还是任何模式?

最佳答案

如果这三个类之间没有真正的区别(除了用于初始化它们的值之外),我认为您应该考虑用 UnitType 枚举替换它们(作为副作用)解决您面临的问题。

enum UnitType {
ARCHER(new Attack(1, 6, 1), new Defense(1, 4, 2), 10, 4),
LANCER(new Attack(...), ...)
RIDER(...)

private final Attack attack;
private final Defense defense;


UnitType(Attack attack, Defence defence, firstValue, secondValue) {
this.attack = attack;
......
}
}

然后你可以使用你的 Unit 类而不需要子类:

class Unit {
Unit(UnitType unitType, Location location, Player owner) {
....
}

public UnitType getType() {
return unitType;
}
}

这允许您在不定义新类的情况下添加单元类型,并使您能够以直接的方式区分不同的单元。

关于java - 没有getClass()如何区分Java中的相似对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357496/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com