我正在从头开始用java编写一个互动小说游戏。我目前正将所有游戏对象引用存储在一个名为ObjectManager的单例中的hashmap中。 ObjectManager有一个名为get的函数,它接受一个整数ID并返回适当的引用。问题是当我需要返回具有更多功能的BaseObject的子类时,它返回一个BaseObject。
所以,到目前为止,我已经添加了一个getEntity函数,它返回BaseEntity(它是BaseObject的子类)。但是,当我需要函数返回一个对象时,该对象是已添加所需功能的BaseEntity的子类,我将需要创建另一个函数。我知道有更好的方法,但我不知道它是什么。我对设计模式知之甚少,而且我不确定在这里使用哪一个。我尝试将'class'作为参数传递,但这并没有把我带到任何地方。
public BaseObject get(int ID){
return (BaseObject)refMap.get(ID);
}
public BaseEntity getEntity(int ID){
return (BaseEntity)refMap.get(ID);
}
谢谢,java忍者!
答案 0 :(得分:2)
我不鼓励你继续这个设计。
Google eradicating singletons from their Java code base;也许这对你来说也是一个好主意。
听起来你正在尝试做一些Spring的ApplicationContext做得很好的事情。您正在尝试编写可配置,灵活的对象工厂。它已经完成了。我会研究像Spring和Guice这样的依赖注入引擎。即使你决定不使用它们,也许它们可以提供一些设计灵感。
您可以做的最好的事情是返回一个Object并进行强制转换。
答案 1 :(得分:2)
如果您有Java 5运行时,请使用泛型返回类型:
public <Entity extends BaseEntity> Entity getEntity(int ID){
return (Entity)refMap.get(ID);
}
答案 2 :(得分:0)
这两种方法做同样的事情;第二个只是保持呼叫者进行演员表演。如果你不想为每个子类创建一个函数,那么一个答案就是:不要。调用者必须进行投射,但它的功能与您现在正在执行的功能一样好。
你可以在泛型中使用相同的方法:
<U> U get(int id, Class<U> clazz) {
return (U) refMap.get(id);
}
但它并没有多大地保存调用者,因为它只传递Class
个对象而不是传递。
如果你不想让调用者做这项工作,你需要编写那些专门的方法。