使用Java反射在交易卡游戏中实现卡片和效果

时间:2017-03-18 18:02:18

标签: java reflection

我正在尝试开发一种电脑纸牌游戏(类似于炉石,但不那么复杂)。我在数据库中有一张桌子,里面有我想要的所有牌。 该表有一个列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>,我可以把我从数据库中获得的所有卡类型放在一起,这样我就可以在事件发生时调用它们的方法。

我似乎错过了一些东西。问题很模糊,但我该怎么做呢?

3 个答案:

答案 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你甚至可以调用子类特定的方法。嗯,你可以这样做 - 但是低垂的往往是一种糟糕的设计气味;所以当你对基本​​卡类提供的方法感到满意时 - 更好。