我正在尝试开发一种电脑纸牌游戏(类似于炉石,但不那么复杂)。我在数据库中有一张桌子,里面有我想要的所有牌。
该表有一个列cardType
,用于存储卡类型,它应该是java对象的相应构造函数。我想基于表字段实例化该类型的对象。
例如:
我们说我的桌子上有一张卡片cardType = BasicMinion(7,7)
。
然后在Java中我有一个类:
BasicMinion extends Card {
public BasicMinion(int health, int attack) {
// initialize
}
public void play(){
//do something
}
}
我可以使用反射来创建一个对象,使用我从数据库中获取的字符串,执行以下操作: Java how to instantiate a class from string
然而,我的卡扩展了类Card
,它有一些可以作出反应的基本事件。反射是否允许我调用基类Card
中的方法以及派生类具有的方法?
基本上我想要一个ArrayList<Card>
,我可以把我从数据库中获得的所有卡类型放在一起,这样我就可以在事件发生时调用它们的方法。
答案 0 :(得分:1)
我的卡扩展了类卡,它有一些基本事件 可以反应。反射是否允许我从基础调用方法 class Card以及派生类有哪些方法?
是的,一旦使用字符串为类创建对象(如使用Class.forName()
和newInstance()
方法,如下所示),您可以调用基类Card
的方法和子类BasicMinion
使用引用。
Class card = Class.forName("com.myproject.Card");
Card cardObj = (Card)card.newInstance();
//invoke cardObj.method1();
Class basicMinion = Class.forName("com.myproject.BasicMinion");
BasicMinion basicMinionObj = (BasicMinion)basicMinion.newInstance();
//invoke basicMinionObj.method1();
答案 1 :(得分:1)
如果你没有很多不同的卡片类型(你很可能没有),你可以使用工厂(我知道,Java和工厂)。 它将允许更清晰的代码和更好的异常处理选项。
示例:
public Card createCard(String definition) {
String type = //do parsing of definition (string splitting etc)
String parameters = //do parsing of definition
switch(type) {
case "BasicMinion":
Long param1 = ///do parsing of parameters
Long param2 = ///do parsing of parameters;
return new BasicMinion(param1, param2);
//add others..
default: throw new UnknownCardTypeException();
}
}
答案 2 :(得分:0)
您可以在此处使用反射来创建类的新实例。
完成之后,你就拥有了普通的物品,它们是相同的&#34;就好像你是第一次创造它们一样。
换句话说:你可以使用反射来使用反射重新创建对象,但是根本不需要反射回来。
最后:使用instanceof和casts你甚至可以调用子类特定的方法。嗯,你可以这样做 - 但是低垂的往往是一种糟糕的设计气味;所以当你对基本卡类提供的方法感到满意时 - 更好。