首页 > 解决方案 > java - 如何在Java运行时获取从抽象类继承的正确实例?

问题描述

我有一个Player类,我需要将抽象类类型向下转换为它的实现类型之一。抽象类被调用World,它由Map1Map2...类扩展。我想制作水平系统,Map1过渡到和Map2等......Map2Map3

我尝试的是以下内容Player.java

public World getCurrentWorldType() {
        World currWorld = getWorld(); 
        if (currWorld instanceof Map1) {
            return (Map1) currWorld;
        } else if (currWorld instanceof Map2) {
            return (Map2) currWorld; 
        }
        return currWorld;
}

我也想按如下方式使用它Player.java

String mapName = getCurrentWorldType().getName();

但是,如果它是,这会导致 RuntimeException Map2。有什么办法可以防止这种情况发生吗?

标签: javaoop

解决方案


我的实现的问题在于它并没有真正遵守 OOP 规则。正如@Mike 'Pomax' Kamermans 和@ Code-Apprentice 在评论中指定的那样:“如果你有处理World实例的代码,那么“真正”的对象是什么子类,这个代码路径需要调用的任何函数都无关紧要应该通过 World 公开,并且应该工作,因为所有子类(无论多深)都继承或覆盖它们”并且“World子类只能通过World超类中定义的函数使用”。

因此,@Mike 'Pomax' Kamermans 给出了一种解决方案:“将 getName 作为公共或受保护方法添加到您的超类中,以便您的子类在没有明确定义自己的情况下继承它?”

或者正如接受的答案所提到的那样。

两者都给出了应该如何实施的正确概念。


推荐阅读