我正在创建一个 Mario 克隆,其中屏幕上的所有内容都是 ScreenElement
的实例。如果一个 ScreenElement
可以被 Mario 着陆,那么它就是可着陆的。
public class ScreenElement {
public boolean isLandable() {
return false;
}
}
某些类会覆盖 isLandable
,例如:
public class GrassBlock extends ScreenElement {
@Override
public boolean isLandable() {
return true;
}
}
不重写 isLandable 的类应该从最接近的父类(super class)继承它。也就是说,我需要多态性。
现在,只要 isLandable
是一个实例方法,一切都可以正常工作。但是,给定的 ScreenElement 是否可登陆取决于类,而不是实例。所以 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;
}
最佳答案
你想太多了。
简而言之,这段代码完全执行您希望它执行的操作。
这就是发生的事情。
您的父类 ScreenElement
默认由 isLandable()
方法定义,并且始终设置为返回 false
。通过创建一个新的 ScreenElement
类,如果他们希望更改此行为,则必须重写该方法才能执行此操作。
事实上,您的 GrassBlock
确实重写了此方法,这表明 GrassBlock
的任何实例都将注册如果检查了其 isLandable()
属性,则为 true
。
通过您的代码修订,您仍然对此想得太多。
当您尝试使用 ScreenElement
的实例时,您需要执行的所有操作 - 无论是 ScreenElement
的实例还是其任何子级的实例- 只是调用方法。
在决定在运行期间检查该属性之前,您不应该关心该属性。您现在检查的方式根本没有任何意义。
举个例子:
ScreenElement vanillaElement = new ScreenElement();
GrassBlock block = new GrassBlock();
System.out.println(vanillaElement.isLandable()); // will print false
System.out.println(block.isLandable()); // will print true
更明确地说,使用示例代码,您可以大大减少它。许多用于检查类型的语句都是不必要的,尤其是在转换时。您保证除了 ScreenElement
更多,并且由于 isLandable()
至少是在其上定义的,因此您永远不会遇到您无法调用该方法的场景。
上面的代码会将你的代码变成这样。我将添加 Mario
参数留给您,因为在此方法中其目的尚不清楚。
private ScreenElement getGenericScreenElement(Mario mario) {
for (ScreenElement element : screenElements) {
if (element.isLandable()) {
//return element if it matches additional criteria
}
}
return null;
}
关于java - 静态方法的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835667/