【问题标题】:How to iterate a list of superclass and accessing subclass properties? [duplicate]如何迭代超类列表并访问子类属性? [复制]
【发布时间】:2018-04-01 19:31:27
【问题描述】:

编辑我的问题,因为我更清楚自己想要什么:

假设我们有 List<A> 有一堆扩展 A 的类实例,每个实例都有自己独特的属性。

就像这个例子:

  1. A 类具有字段 int x、getter 和 setter。
  2. B 类扩展了 A,并且还具有字段 int y 及其 getter 和 setter。
  3. C 类扩展了 A,并且还具有带有 getter 和 setter 的字段 int z。

我不想在迭代列表时使用向下转换和instanceof

我读到这篇文章很有趣: https://softwareengineering.stackexchange.com/questions/245263/how-to-avoid-downcasting

什么是正确的方法?

谢谢

【问题讨论】:

  • B b = new B().
  • 如果你需要 y,首先做 B b = new B()。
  • 另外,子类拥有比其超类更多的字段也是有意义的。每次你用一个字段编写自己的类时,你都在这样做,因为它扩展了没有该字段的 Object。
  • 最好的做法是,如果您在其余代码中只关心变量引用 A。这里不是这种情况。你很少做Object o = "hello",对吧?因为你想要一个 String 类型的变量,而不是 Object 类型的变量。
  • 没有。使用每个对象、适配器或访问者模式的多态方法。

标签: java oop inheritance


【解决方案1】:

在大多数情况下,您应该使用B b = new B() 而不是A b = new B()。如果您必须使用A 类型的字段,那么向下转换是您最好的选择。但请记住,它不应该经常发生。

【讨论】:

  • 感谢您的回答,我稍微改变了我的问题。
  • 这个答案对于一般情况是错误的。主要规则是对接口进行编码,对抽象进行编码,而不是对具体进行编码。除非绝对必要,否则避免具体编码。已经创建了完整的设计模式来避免这样做,例如访问者模式。
【解决方案2】:

是的,子类拥有比超类更多的字段是有意义的。

如果您发现自己不得不向下转换,那么这可能意味着您应该使用要向下转换的静态类来实例化变量,在这种情况下,请执行 B b = new B() 而不是 A b = new B()。 当您使用A b = new B() 时,这意味着您要在其中使用变量的上下文/函数需要A 类型的对象(即需要使用A 中声明的函数),因此,如果您失败-转换为B,您可能需要检查您的设计并询问自己要在该上下文/函数中使用的数据类型。

【讨论】:

  • 感谢您的回答,我稍微改变了我的问题。
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多