如何使面向对象的java项目完全通用

时间:2014-01-18 20:25:58

标签: java oop generics

目前在此回购协议中:https://github.com/quinnliu/WalnutiQ

我使用以下代码创建部分大脑模型:

    Neocortex unconnectedNeocortex = new Neocortex(new Region("V1", 4, 4,
            4, 50, 3), new RegionToRegionRectangleConnect());

    LGN unconnectedLGN = new LGN(
            new Region("LGN", 8, 8, 1, 50, 3));

    Retine unconnectedRetina = new Retine(65, 65);

    NervousSystem nervousSystem = new NervousSystem(unconnectedNeocortex,
            unconnectedLGN, unconnectedRetina);

    // connect Retine to LGN
    Retine retine = nervousSystem.getPNS().getSNS().getRetine();
    LGN LGN = nervousSystem.getCNS().getBrain()
            .getThalamus().getLGN();
    SensorCellsToRegionConnect sensorCellsToRegionConnect = new SensorCellsToRegionRectangleConnect();
    sensorCellsToRegionConnect.connect(retine.getVisionCells(),
            LGN.getRegion(), 0, 0);

    // connect LGN to V1 Region of Neocortex
    Neocortex neocortex = nervousSystem.getCNS().getBrain().getCerebrum()
            .getCerebralCortex().getNeocortex();
    RegionToRegionConnect regionToRegionConnect = new RegionToRegionRectangleConnect();
    regionToRegionConnect.connect(LGN.getRegion(),
            neocortex.getCurrentRegion(), 0, 0);

你可能已经注意到我上面使用的以下代码有不好的代码味道:

    Retine retine = nervousSystem.getPNS().getSNS().getRetine();
    LGN LGN = nervousSystem.getCNS().getBrain().getThalamus().getLGN();

我想通过将其变成这样的东西来解决这个问题:

Retine retine = nervousSystem.get<Retine>();
LGN LGN = nervousSystem.get<LGN>();

我被告知这是可能的,但我目前不知道该怎么做。有人可以解释我如何让这个工作的步骤?谢谢!

1 个答案:

答案 0 :(得分:1)

听起来你想要某种自动图形遍历系统(与泛型没什么关系)。

类似的东西:

public abstract class BodyPart {

  private List<? extends BodyPart> _linkedParts;

  public <T extends BodyPart> T getPart(Class<? extends T> clazz) {
    for(BodyPart part : _linkedParts) {
      if(clazz.isInstance(part)) { 
        return clazz.cast(part);
      }
      T childPart = part.getPart(clazz);
      if(childPart != null) {
        return childPart;
      }
    }
    return null;
  }
}

然后,假设所有模型都扩展了BodyPart(并且它们的直接链接部分被添加到_linkedParts列表中),您可以执行以下操作:

Retine retine = nervousSystem.getPart(Retine.class);

显然,这假设所有链接都有唯一的结果,没有循环链接。如果情况并非如此,那么你必须使逻辑变得更聪明(检测圆圈,返回多个结果等)。