道歉,如果措辞不佳或可搜索,我找不到任何内容,我几乎完全是自学成才。
我有一个Entity
类和多个子类,Building
和Creature
在这里是相关的。
我有一个setTarget(Entity e)
方法,我想用于Building
和Creature
类,因为在这个级别它们是相同的。
我想知道是否可以将e转换为Building
或Creature
,具体取决于它的类型,而不是使用相同的代码创建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();
}
这可以实现吗?
答案 0 :(得分:2)
为什么需要区分Creature
和Building
?
我可能会创建一个包含方法Targetable
的接口setTarget()
(或名称更好的东西),并由Creature
和Building
实现。
这种方法在您的方法setTarget(Entity e)
中,您不需要查询Creature
和Building
(以及将来甚至更多的类),但您只需检查{{1将它强制转换为此接口类型并在其上运行e instanceof Targetable
。
注意:使用setTarget()
和强制转换的需要通常表明您的代码没有以最佳方式构建......
答案 1 :(得分:1)
您可以使用Java关键字instanceof
或getClass()
。这两者之间的区别在于,如果,例如,类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
然后有Creature
和Targetable
恭维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)