java - 将子类存储在父类(super class)数组中并使用子类的方法(Java)

标签 java inheritance polymorphism subclass superclass

我的问题如下:

我有一个名为 Product 的抽象类和 2 个以上的名为 Book 和 Magazine 的子类。杂志有 1 个在产品或书籍中找不到的额外方法。

到目前为止一切顺利。但我想像这样将这些不同的产品存储在 1 个数组中:

List<Product> products = new ArrayList<>(); products.add(new Book()); products.add(new Magazine());

还是没问题吧?但是此时我也想这样做(索引 1 是一本杂志):

products.get(1).magazineMethod()

这就是一切都失败的地方。我知道 instanceof 以及它如何解决我的问题。然而,在谷歌搜索和查看 stackoverflow 后,似乎在这件事上使用 instanceof 是不好的。对于每个不同的 Product 子类,我都必须使用 instanceof 添加另一个检查。我问了我的老师这件事,他不能给我一个正确的答案,并告诉我他会检查一下。

我知道多态性是如何工作的,如果 Product 也有 magazineMethod() 它就会工作。但这没有任何意义,因为产品不是杂志,这样做会破坏整个继承点。

是的,这是家庭作业的一部分,但我心中的问题是如此基础,以至于我想要正确的解决方案而不是一些解决方法/黑客工作。

最佳答案

从根本上说,你不能。如果您的变量是 Foo 类型,则您只能对 Foo 或 Foo 的父级使用函数。

解决方法:

  • 在将杂志传递给数组之前,还要将其存储在一个杂志类型的变量中,在使用杂志功能时引用该变量

  • 打电话前把产品投到杂志上

  • 代替 magazineMethod(),有一个适用于书籍和杂志的通用方法,其行为被子类覆盖。

第三个选项通常是最好的。

关于java - 将子类存储在父类(super class)数组中并使用子类的方法(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214304/

相关文章:

Java 语法分析器 : How to find global variable (data-fields) from a class

Java 9 与加特林

java - Java 网络搜索 API

java - 协助构建具有多个类别的体育游戏

c# - 如何使用 get set 从继承的属性中删除 set 访问器

c++ - 友元函数中指向基类参数类型的指针

java - 新手数组问题

c++ - 派生类中vtable的理解

c++ - 可以为虚函数实现绕过 vtable 吗?

c# - 派生类对象如何添加到基类对象列表