java - java - 如何在Java运行时获取从抽象类继承的正确实例?
问题描述
我有一个Player
类,我需要将抽象类类型向下转换为它的实现类型之一。抽象类被调用World
,它由Map1
等Map2
...类扩展。我想制作水平系统,Map1
过渡到和Map2
等......Map2
Map3
我尝试的是以下内容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
。有什么办法可以防止这种情况发生吗?
解决方案
我的实现的问题在于它并没有真正遵守 OOP 规则。正如@Mike 'Pomax' Kamermans 和@ Code-Apprentice 在评论中指定的那样:“如果你有处理World
实例的代码,那么“真正”的对象是什么子类,这个代码路径需要调用的任何函数都无关紧要应该通过 World 公开,并且应该工作,因为所有子类(无论多深)都继承或覆盖它们”并且“World
子类只能通过World
超类中定义的函数使用”。
因此,@Mike 'Pomax' Kamermans 给出了一种解决方案:“将 getName 作为公共或受保护方法添加到您的超类中,以便您的子类在没有明确定义自己的情况下继承它?”
或者正如接受的答案所提到的那样。
两者都给出了应该如何实施的正确概念。
推荐阅读
- python - keras 强化学习 - 具有多个输出的动作
- python - 稀疏矩阵减法
- java - Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序
- c - C中的编码和解码
- c# - Dapper 连接问题:TCP 提供程序,错误:40 - 无法打开与 SQL Server 的连接
- csv - 如何在 kdb 中加载以 " 作为分隔符的 CSV 文件?
- android - Xamarin.Forms (Android) 清单中的 Fileprovider 标记导致应用程序在启动时崩溃
- vue-component - 如何在Vue中使用v-for传递函数的参数?
- android - 如何在运行时服务上访问 SharedPreference?
- powershell - 使用 PowerShell Core 6 / PowerShell 7 运行 Vagrant Provisioner