是否可以在同一方法中将对象转换为两个不同的东西?

时间:2016-04-02 20:28:20

标签: java

道歉,如果措辞不佳或可搜索,我找不到任何内容,我几乎完全是自学成才。

我有一个Entity类和多个子类,BuildingCreature在这里是相关的。

我有一个setTarget(Entity e)方法,我想用于BuildingCreature类,因为在这个级别它们是相同的。

我想知道是否可以将e转换为BuildingCreature,具体取决于它的类型,而不是使用相同的代码创建2个完整方法。

private void setTarget(Entity e) {
    if (e.getType.equals("Creature")) {
        Creature c = (Creature)e; //rest of code assumes c is now a creature rather than a building
    }
}

我意识到我可以通过将目标机制放在Entity类中来实现这一点,但是那个代码与所有其他没有/需要目标的子类无关。

非常感谢任何帮助或提示,提前谢谢。

编辑: 我查看了instanceof,它确实清理了一些代码,但没有人理解我的意思;

private void setTarget(Entity e) {
    if (e instanceof Creature) {
        Creature c = (Creature)e;
    } else if (e instanceof Building) {
        Building c = (Building)e;
    }
    //Building OR Creature code here ie;
    c.setTarget();
}

这可以实现吗?

2 个答案:

答案 0 :(得分:2)

为什么需要区分CreatureBuilding

我可能会创建一个包含方法Targetable的接口setTarget()(或名称更好的东西),并由CreatureBuilding实现。

这种方法在您的方法setTarget(Entity e)中,您不需要查询CreatureBuilding(以及将来甚至更多的类),但您只需检查{{1将它强制转换为此接口类型并在其上运行e instanceof Targetable

注意:使用setTarget()和强制转换的需要通常表明您的代码没有以最佳方式构建......

答案 1 :(得分:1)

您可以使用Java关键字instanceofgetClass()。这两者之间的区别在于,如果,例如,类SmallBuilding子类Building,那么mySmallBuilding instanceof Building将返回true,而mySmallBuilding.getClass().equals (Building.class)将返回false,因为在getClass()上调用SmallBuilding将返回与Class类不同的Building对象。话虽如此,通常建议在像你这样的子类依赖程序中使用instanceof,并在getClass()中使用equals(),例如,编写private void setTarget(Entity e) { if (e instanceof Creature) { Creature c = (Creature)e; // Creature-specific code here } else if (e instanceof Building) { Building b = (Building)e; // Building-specific code here } // Could add an else for other Entity subclasses (might throw UnsupportedOperationException) } 方法(因为两个对象必须属于同班)。这是一个如何工作的例子:

private void setTarget(Entity e) {
    if (e instanceof Creature) {
        Creature c = (Creature)e;
        c.setTarget();
    } else if (e instanceof Building) {
        Building b = (Building)e;
        b.setTarget();
    }
    // Could add an else for other Entity subclasses (might throw UnsupportedOperationException)
}

编辑:根据您对问题所做的编辑,您可以执行以下操作:

setTarget()

必须在if个语句中都有setTarget()。另一种选择是为public interface Targetable { public void setTarget(); } 定义一个接口,如下所示:

Building

然后有CreatureTargetable恭维setTarget()。然后,您可以将private void setTarget(Targetable t) { t.setTarget(); } 定义为:

private void setTarget(Entity e) {
    if (t instanceof Targetable) {
        ((Targetable)t).setTarget();
    }
}

或者:

extractInt :: String -> Either String [Int]
extractInt s = mapM readEither (words s)