我试图了解多态性,以及通过子类和超类进行继承时的最佳实践。我有三类:物品、书籍和 DVD。Items 是超类,其中 Books 和 DVD 是扩展 Items 的子类。
起初,我尝试将 Book 和 DVD 类型的新对象存储在 Items 类型的数组列表中,效果很好。
ArrayList<Items> library = new ArrayList<Items>;
library.add(new DVD(...));
library.add(new Book(...));
当我尝试从 DVD 子类调用方法 getRuntime 时出现问题。这将返回 DVD 的运行长度。我无法将此方法移至 Items 超类,并且它不适用于一本书。
library.get(0).getRuntime();
我可以理解为什么会出错,数组列表中的对象存储的类型为 Items,并且只能访问 Items 类中的方法。因此,一种选择是强制转换为正确的子类类型:
((DVD) library.get(0)).getRuntime();
但是如果我从子类调用许多方法,我是否每次都必须强制转换?另外,像这样使用演员表被认为是不好的做法吗?
我的另一个选择是为每个子类创建两个单独的数组列表:
ArrayList<DVD> libraryDvds = new ArrayList<DVD>;
ArrayList<Books> libraryBooks = new ArrayList<Books>;
不过,这难道没有打败多态性的要点吗?此外,假设我现在想打印我所有项目的列表,我必须调用两个数组列表,而不仅仅是一个包含所有项目的列表。
感谢您的帮助,如果需要,我可以提供更详细的代码示例。
如果getRuntime
真的特定于 DVD,那么演员表是唯一的出路。您将需要在每次需要时进行投射。在转换之前,好的做法是在(使用 instanceof)或 catch 之前检查类型ClassCastException
。
但更优雅的方法可能是使用 DVD 列表而不是项目列表。如果需要,您还可以有一个项目列表。
ArrayList<Items> library = new ArrayList<Items>; // list to use when processing the whole library
ArrayList<DVD> libraryDvds = new ArrayList<DVD>; // list to use when processing only DVDs
我认为您这样做并没有打败多态性,因为您只为 DVD 执行特定操作,因此您要实现的功能不是多态性的。
最后一个解决办法,如果你真的想用polymporphism这里将申报getRuntime()
上Item
,写在书的执行,会做回一个实例的Runtime
这什么都不做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句