将子类存储在超类数组中,并使用子类的方法(Java)
我的问题如下: 我有一个名为Product的抽象类和2+个名为Book and Magazine的子类。杂志有一个在产品或书籍中找不到的额外方法 到目前为止还不错。但我想将这些不同的产品存储在1个阵列中,如下所示:将子类存储在超类数组中,并使用子类的方法(Java),java,inheritance,polymorphism,subclass,superclass,Java,Inheritance,Polymorphism,Subclass,Superclass,我的问题如下: 我有一个名为Product的抽象类和2+个名为Book and Magazine的子类。杂志有一个在产品或书籍中找不到的额外方法 到目前为止还不错。但我想将这些不同的产品存储在1个阵列中,如下所示: List products=new ArrayList(); 产品。添加(新书()); 产品。添加(新杂志()) 还是没问题吧?然而,在这一点上,我也想这样做(索引1是一本杂志): products.get(1.magazineMethod() 这就是一切都变得平淡的地方。我知道in
List products=new ArrayList();
产品。添加(新书());
产品。添加(新杂志())代码>
还是没问题吧?然而,在这一点上,我也想这样做(索引1是一本杂志):
products.get(1.magazineMethod()
这就是一切都变得平淡的地方。我知道instanceof以及它将如何解决我的问题。然而,通过谷歌搜索和查看stackoverflow,似乎在这个问题上使用instanceof是不好的。对于每个不同的产品子类,我必须添加另一个instanceof检查。我问我的老师这件事,他不能给我一个正确的答案,并告诉我,他会检查一下
我知道多态性是如何工作的,如果产品也有magazineMethod()它就会工作。但这是毫无意义的,因为一个产品不是一本杂志,这样做会破坏整个继承点
是的,这是家庭作业的一部分,但我脑海中的问题是如此的基本,以至于我希望找到正确的解决方法,而不是一些变通方法/黑客作业。基本上,你不能。如果变量的类型为Foo,则只能在Foo或Foo的父级上使用函数
解决办法:
- 在将刀库传递到阵列之前,还应将其存储在刀库类型的变量中,并在使用刀库功能时参考该变量
- 在打电话之前将产品投到杂志上
- 与magazineMethod()不同,它有一个同时适用于书籍和杂志的泛型方法,其行为由子类重写
第三个选项通常是最好的。如果您的收藏类型为产品
为什么要调用magazineMethod
?@user7,因为它是杂志类属性的获取者,而杂志类属性不在产品或书籍中。