将子类存储在超类数组中并使用子类的方法 (Java)
Store subclass in an array of superclasses and use methods of subclass (Java)
我的问题如下:
我有一个摘要 class 称为产品和 2+ 个子class 称为书籍和杂志。杂志有 1 个在产品或书籍中找不到的额外方法。
到目前为止一切顺利。但是我想像这样将这些不同的产品存储在 1 个数组中:
List<Product> products = new ArrayList<>();
products.add(new Book());
products.add(new Magazine());
还是没问题吧?但是此时我也想这样做(索引 1 是一本杂志):
products.get(1).magazineMethod()
这就是一切都失败的地方。我知道 instanceof 以及它如何解决我的问题。然而,在谷歌搜索和查看 Whosebug 后,似乎在这件事上使用 instanceof 是不好的。对于每个不同的 Product subclass,我将不得不使用 instanceof 添加另一个检查。我问了我的老师这件事,他不能给我一个正确的答案,并告诉我他会检查一下。
我知道多态性是如何工作的,如果 Product 也有 magazineMethod() 它会起作用。但这没有任何意义,因为产品不是杂志,这样做会破坏整个继承点。
是的,这是家庭作业的一部分,但我心中的问题是如此基础,以至于我想要正确的解决方案而不是一些 workaround/hackjob。
从根本上说,你不能。如果您的变量是 Foo 类型,您只能在 Foo 或 Foo 的父级上使用函数。
解决方法:
在把弹匣传给数组之前,还要把它存入一个Magazine类型的变量中,在使用弹匣函数的时候引用那个变量
调用前将产品投射到杂志
而不是 magazineMethod(),有一个适用于书籍和杂志的通用方法,其行为被子类覆盖。
第三个选项通常是最好的。
我的问题如下:
我有一个摘要 class 称为产品和 2+ 个子class 称为书籍和杂志。杂志有 1 个在产品或书籍中找不到的额外方法。
到目前为止一切顺利。但是我想像这样将这些不同的产品存储在 1 个数组中:
List<Product> products = new ArrayList<>();
products.add(new Book());
products.add(new Magazine());
还是没问题吧?但是此时我也想这样做(索引 1 是一本杂志):
products.get(1).magazineMethod()
这就是一切都失败的地方。我知道 instanceof 以及它如何解决我的问题。然而,在谷歌搜索和查看 Whosebug 后,似乎在这件事上使用 instanceof 是不好的。对于每个不同的 Product subclass,我将不得不使用 instanceof 添加另一个检查。我问了我的老师这件事,他不能给我一个正确的答案,并告诉我他会检查一下。
我知道多态性是如何工作的,如果 Product 也有 magazineMethod() 它会起作用。但这没有任何意义,因为产品不是杂志,这样做会破坏整个继承点。
是的,这是家庭作业的一部分,但我心中的问题是如此基础,以至于我想要正确的解决方案而不是一些 workaround/hackjob。
从根本上说,你不能。如果您的变量是 Foo 类型,您只能在 Foo 或 Foo 的父级上使用函数。
解决方法:
在把弹匣传给数组之前,还要把它存入一个Magazine类型的变量中,在使用弹匣函数的时候引用那个变量
调用前将产品投射到杂志
而不是 magazineMethod(),有一个适用于书籍和杂志的通用方法,其行为被子类覆盖。
第三个选项通常是最好的。