将子类存储在超类数组中并使用子类方法(Java)

时间:2017-04-04 17:53:42

标签: java inheritance polymorphism subclass superclass

我的问题如下:

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

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

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

还没有问题吗?但是在这一点上我也想这样做(索引1是杂志):

products.get(1).magazineMethod()

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

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

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

1 个答案:

答案 0 :(得分:3)

从根本上说,你做不到。如果你的变量是Foo类型,你只能使用Foo或Foo父母的函数。

解决方法:

  • 在将杂志传递到阵列之前,还要将其存储在Magazine类型的变量中,并在使用杂志功能时参考该变量

  • 在致电

  • 之前将产品投放到杂志上
  • 而不是magazineMethod(),有一个适用于书籍和杂志的通用方法,其子行为会被子类覆盖。

第三种选择通常是最好的。