Java - 我的代码显然违背了常见的OOD范例,但不确定如何改进它

Sli*_*ims 12 java oop class hashtable

编辑:我非常感谢大家的意见.我从所有的反应中获得了一些东西,并且对OOD学到了很多东西.

我正在制作一个简单的虚拟桌面战争游戏.为了表示战场上的单位,我有以下简单的类层次结构:抽象类单元和两个派生类,即部队和车辆.

我有另一个类,它具有游戏中所有单元的哈希表.哈希表值是单元类型,因此我可以在O(1)时间内引用它们.

在大多数情况下,这很好,但有时候调用者需要知道某些东西是某个部队还是从这些派生类调用特定方法的工具.为了适应这种情况,我创建了两个get方法来强制执行这些类型:

  public Troop getTroop(String uniqueID) {
    Unit potentialTroop = get(uniqueID);
    if(potentialTroop instanceof Vehicle) {
      throw new InternalError();
    }
    return (Troop) potentialTroop;
  }

  public Vehicle getVehicle(String uniqueID) {
    Unit potentialVehicle = get(uniqueID);
    if(potentialVehicle instanceof Troop) {
      throw new InternalError();
    }
    return (Vehicle) potentialVehicle;
  }
Run Code Online (Sandbox Code Playgroud)

(注意它所属的类只扩展了Hashtable,所以这里使用的get方法是Java的hashtable的get方法.)

所以我认为这是糟糕的OOD设计,因为如果我进一步扩展单元,我将不得不为此哈希表添加更多检查和更多#get方法.

我说的是对的吗?如果是这种情况,是否有人有其他OOD建议?

Per*_*ion 3

这是执行此操作的简单方法,不一定是最好的,但它满足以下要求:

  1. 能够从您的Unit集合中动态获取特殊类型
  2. 稍后能够添加其他Unit类型,而无需添加一堆处理程序方法。

该解决方案使用“模板”类来执行匹配:

@SuppressWarnings("unchecked")
public <T extends Unit> T getSpecializedUnitType(Class<T> unitTypeClass, String uniqueID) {
    Unit potentialTroop = units.get(uniqueID);
    if(potentialTroop == null) return null;

    return potentialTroop.getClass().equals(unitTypeClass) ?
        (T) potentialTroop : null;
}
Run Code Online (Sandbox Code Playgroud)

我假设您将更正您的代码,不是从 扩展Map,而是封装它。