java - 静态方法的多态性

标签 java

我正在创建一个 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/

相关文章:

java - 如何从 HttpServlet 调用 RemoteServiceServlet 中的方法?

java - Form Action属性错误struts2

java - 如何将毕加索的图像存储在位图变量中

java - 如何拆分字符串序列并将每个元素转换为 double

Java http 客户端和 POODLE

java - 两个整数相乘溢出导致负数

java - 为什么 i += i + a[i++] + a[i++] + a[i++] 结果是 8?

java - 文件大小对于 java 来说太大

java - 在部署在 heroku 上的 Web 应用程序中使用 Java Sound API

java - spring mvc 中预加载对象的 application_start 事件?