2011-05-07 52 views
0

我创建了4类:DVD项目数据库Cd and Dvd延伸自商品数据库类存储ArrayList项目Java Arraylist和继承调用正确的方法。帮助

我卡上创建的数据库的方法,它调用在任何DVD的方法显示。不过,我设法显示Cds

如何显示所有项目?例如。

项目数= 1张
CD

项目数= 2
DVD

项目数量= 3

非常感谢。

编辑

的显示方法在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

回答

0

你应该从列表中获取项目,而不是CD,然后只需调用在项目类中声明的方法。如果子类重写方法,子类中的方法将自动被调用。

编辑:刚刚检查了你的classdiagram。方法显示应该添加到Item类中,并由子类重写。

+0

显示方法不同于cd和dvd – Sanjay 2011-05-07 17:12:50

0

您正在寻找instanceof

if (item instanceof Cd) 

然而,正如其他人所说的......它可能向坏的一流的设计点。为什么你需要知道类型是什么?

+1

确实,但这并不是一个好的整体解决方案。 – 2011-05-07 16:55:17

+0

是啊......我来回踱步,现在怎么编辑。在某些情况下,'instanceof'可能有意义,但我不知道这是一个。 – 2011-05-07 16:56:06

0

不明确投射;这打破了多态的目的。在您的Item基类中声明一个摘要display方法,然后在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(); 
} 

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

1

您可能应该在Item课程中有public abstract void display();。可以想象,Itemss能够显示自己是有意义的。然后你会在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剧组。

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