继承这种java接口策略合理吗?
我一直在考虑为我的代码实现某种策略
这是我的设置:
我有一个叫做“对象”的接口。 然后我有一个名为“实体”的接口,它扩展了“对象”。 从实体中涌现出无数的实现,比如“军队”、“城市”、“柠檬”等等
现在,我想把所有这些物体收集成某种形式的地图。然后从这个映射中,我想得到“Object”的具体实现
我想出的解决方案如下:
对象具有以下方法:
public Entity getEntity()
对象的所有实现都返回null,而实体返回自身
同样,在实体中,我会:
public Army getArmy()
public City getCity()
这样,我就可以简单地从映射中提取一个对象,并通过一系列空检查从中获取特定的类,如下所示
Object o = Objects.getObject(2dCoordinates);
Entity e = o.getEntity();
if (e != null){
Army a = e.getArmy();
if (a != null)
a.armySpecificMethod();
}
所有这些都没有使用“instanceof”和施法,这是我讨厌的
问题是这是否有一些不可预见的问题?我宁愿在重构我的代码之前向了解我的人学习,然后自己去发现
# 1 楼答案
你问你的策略是否有陷阱。我会说不,因为C#对其^{} 关键字使用相同的策略。例如:
e as Army
如果e
是-aArmy
,则返回e
,否则返回null
。它基本上是一个cast,而不是失败返回null
然而,您不必使用接口实现此功能,您可以编写自己的
as
方法,例如:用法:
# 2 楼答案
另一种方法是注册在特定事件中调用的回调/策略。诸如此类:
你的GameMap(或其他)实现是:
这是一个非常粗糙的未经测试的实现,但希望您能理解。这里有一个非泛型实例的用法(在onMapClicked中),但它应该是安全的,因为我们正在检查
registerListener
中的输入类型