Java Arraylist和继承调用正确的方法。救命

时间:2011-05-07 16:48:37

标签: java inheritance

我创建了4个类: Cd Dvd Item Database Cd Dvd Item 扩展。 数据库类存储{em> Items 的ArrayList

我坚持在数据库类中创建一个方法,该方法在 Cd Dvd 中调用方法显示。但是我设法显示 Cds

如何显示所有项目? E.g。

  

项目编号= 1
  CD

     

项目编号= 2
  DVD

     

项目编号= 3
  镉

非常感谢。

修改

Cd Dvd 的显示方法不同。

public void displayAll() {

    for (int i = 0; i < items.size(); i++) {

        Cd theCd = (Cd) items.get(i);
        // Dvd theDVD = (Dvd) items.get(i);

        System.out.println("Item Number = " + i);
        theCd.display();

        // theDvd.display

    }

}

我的班级图是:

Class Diagram http://img571.imageshack.us/img571/1460/unledsca.png

5 个答案:

答案 0 :(得分:1)

您的public abstract void display();课程中可能应该有Item。可以想象Items能够展示自己是有意义的。然后,您将在CDDVD中实现它(听起来就像您已经拥有的那样)。然后你就不需要垂头丧气了:

public void displayAll()
{        
     for (int i = 0; i < items.size(); i++) {  
         Item item = (Item) items.get(i); 
         System.out.println("Item Number = " + i);
         item.display();
     }
}

如果您使用支持泛型的JDK版本,请考虑使用ArrayList<Item>而不是ArrayList。然后你也可以摆脱Item演员阵容。

答案 1 :(得分:0)

你应该从列表中获取Item,而不是Cd,然后只调用Item类中声明的方法。如果子类中的方法是重写方法,则会自动调用它们。

编辑:刚检查了你的课程图。方法显示应添加到Item类中,并由子类覆盖。

答案 2 :(得分:0)

您正在寻找instanceof

if (item instanceof Cd)

然而,正如其他人所说的......它可能指向糟糕的课堂设计。为什么你需要知道这种类型是什么?

答案 3 :(得分:0)

不要明确施放;这违背了多态的目的。在display基类中声明一个抽象的Item方法,然后在CdDvd中覆盖它。

然后你的循环可以是:

List<Item> my_list = new ArrayList<Item>();

...

for (int i = 0; i < items.size(); i++) {
    System.out.println("Item number = " + i);
    items[i].display();
}

这将始终调用正确的方法。

答案 4 :(得分:0)

 for (int i = 0; i < items.size(); i++) {  


     Item theItem = (Item)items.get(i); 

     System.out.println("Item Number = " + i);
     theItem.display();


 }

转换为项目,而不是CD或DVD。确保Item有一个display()方法。 另外,如果您使用的是Java 5或更高版本,请查看generics