介绍多态性101 java

时间:2015-02-17 19:22:20

标签: java polymorphism

我正在制作一个小RPG。有一个Item类,它是游戏中每个项目的父级。这些物品可以是药水(这是一个类)或绷带(这是一个类)。

Item类看起来像这样:

public class Item
{
int qty;
String name;
Hero hero1;

public void passHero(Hero hero1)
{
    this.hero1 = hero1;
}

public void use()
{
    if(qty == 0)
    {
        System.out.println("You have no more of this item to use.");
    }
    else
    {    
        qty--;
    }
}

public void addInv(int value)
{
    qty = qty + value;
}
}

传递Hero类的方法。 一种使用项目的方法。 添加到商品库存的方法。

此方法激活这些项类:

public void initializeItemInventory()
{
    items[0] = new Potion();
    items[1] = new Bandage();
}

理论上,这种方法可以打印所有项目及其数量:

public void useInventory()
{
    for(int i = 0; i<items.length; i++)
    {
        System.out.println("Enter: " + i + " for " + items[i].name);

    }

    int response = input.nextInt();
    items[response].use();

}

作为一个例子,Potion类有一个实例变量,如:

String name = "Potion";

所以我的问题。为什么在useInventory方法中没有正确调用Potion的名称变量。它返回null,它告诉我它返回父类Item名称,而不是单个子类变量的名称。

2 个答案:

答案 0 :(得分:3)

public class Item
{
  int qty;
  String name;
  ...

Item类已经有name,这是您从Item类型变量中访问的内容:

items[0].name

所以,如果你有

public class Potion extends Item
{
  String name = "Potion";
  ...

然后Potion类有两个 name字段:

Potion p = new Potion();
System.out.println(p.name);
System.out.println((Item) p).name);

正如您所说,您需要多态,但它仅适用于方法。因此,你需要一个吸气剂:

public class Item
{
  String name;
  public String getName() { return name; }
  ...

Potion子类中,您可能有

public class Potion extends Item
{
  public Potion() { this.name = "Potion"; }
  ...

items[0].getName()现在将按预期工作。

附加说明

我将添加此内容以显示多态性的一些功能。

如果碰巧同一类的所有实例的name属性始终相同,则可以通过完全消除存储name变量的需要轻松地重构基于getter的解决方案:

public class Item
{
  public String getName() { return "Generic item"; }
  ...

public class Potion extends Item
{
  @Override public String getName() { return "Potion"; }
  ...

答案 1 :(得分:2)

而不是在你的子类中声明一个新的变量,如&#34; String name =&#34; Potion&#34 ;;&#34; 使用构造函数将值传递给超类,如下所示:

// the Item supuerclass has one constructor
public Item(name) {
  this.name = name;
} 

// the Potion subclass has one constructor
public Potion() {
  super("Potion");
}