我创建了一个Mario克隆,其中屏幕上的所有内容都是ScreenElement
的一个实例。 A ScreenElement
是Landable,如果它可以由马里奥降落。使用静态方法的多态性
public class ScreenElement {
public boolean isLandable() {
return false;
}
}
一些类覆盖isLandable
,例如:
public class GrassBlock extends ScreenElement {
@Override
public boolean isLandable() {
return true;
}
}
和类不重写isLandable
应该从最近的超类,确实继承了它。也就是说,我需要多态。 现在,只要isLandable
是一个实例方法,这一切都可以正常工作。然而,给定的ScreenElement
是否Landable取决于类,而不是实例。所以isLandable
应该是静态的。但是,如果我使它成为静态的,我不能覆盖它或继承没有明确定义它的子类。有没有一个简单的解决方法来解决这个问题。
编辑: 我意识到,我现在设置的方式,它工作正常,但我提出这个问题的原因是因为我遇到了问题。给定一个延伸ScreenElement
的类,我需要找出isLandable
的结果。我能想到的唯一的事情是这样的:
private <S extends ScreenElement> boolean isThisLandable(Class<S> category) {
return category.newInstance().isLandable();
}
我要创建一个新的实例来找出一些不依赖于实例,这似乎不自然。
编辑2:这是我正在处理的特定的一段代码。
private <S extends ScreenElement> S getGenericScreenElement(Mario mario, Class<S> category) {
for (ScreenElement element : screenElements) {
if (category.isInstance(element)) {
S elementToTest = category.cast(element);
if (elementToTest.isLandable()) {
//return elementToTest if it matches additional criteria
}
}
}
return null;
}
为什么不制作一个'LandableElement'类继承'ScreenElement'并且被landable元素继承?然后你可以重写'Landable Element'中的方法,或者使用'instanceof LandableElement'来检查对象是否可以放置。 – Zarwan
@Zar,'instanceof'可能不是最好的建议;一般或其他。 – ChiefTwoPencils
@Zar在某些情况下,我有一个子类重写'isLandable'第二次将其设置为false。 – Amaar