【问题标题】:Subclass references another subclass, accessible from the same getter/setter子类引用另一个子类,可从同一个 getter/setter 访问
【发布时间】:2023-03-31 18:33:01
【问题描述】:

我正在尝试在 Java 中实现 OOP 继承设计,如果向我提供OrderTypeA 的子类,并调用它的getOrderLines(),它将返回OrderLineTypeA 类型的集合。同样,如果我有一个Order 的实例,它的getOrderLines() 将返回一个实例Collection<OrderLine> 的集合

我尝试了以下,似乎无法编译。

我想要达到的目标:

建议的架构:

订购

public class Order {
    protected List<? extends OrderLine> orderLines;

    public List<? extends OrderLine> getOrderLines() {
        return orderLines;
    }

    public void setOrderLines(List<OrderLine> orderLines) {
        this.orderLines = orderLines;
    }
}

订单行

public class OrderLine {
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

订单类型A

public class OrderTypeA extends Order {
    protected List<OrderLineTypeA> orderLines;

    @Override
    public List<OrderLineTypeA> getOrderLines() {
        return orderLines;
    }

    @Override
    public void setOrderLines(List<OrderLine> orderLines) {
        this.orderLines = orderLines; // does not compile
    }
}

OrderLineTypeA

public class OrderLineTypeA extends OrderLine {
    private OrderTypeA order;

    @Override
    public Order getOrder() {
        return order;
    }

    @Override // does not compile, technically not an override
    public void setOrder(OrderTypeA order) {
        this.order = order;
    }
}

我尝试过的其他解决方案包括在子类中省略字段声明,以隐藏父类中的字段。

其他想法包括覆盖子项中的方法,以及将返回语句转换为子项的类型。

谢谢!

【问题讨论】:

  • 你遇到了什么错误?
  • 在 OrderLineTypeA 的覆盖处,在 setOrder 方法中,我得到:Method does not override method from its superclass 在 OrderTypeA 中,我在 setter 方法中得到,提供的类型不是必需的类型。
  • 在 OrderTypeA 的 setOrderLines() 中,您尝试将 OrderLine 类型的列表分配给 OrderLineTypeA 类型的列表。为子类分配其父类型不起作用。如果我错过了什么,请纠正我

标签: java oop inheritance


【解决方案1】:

我认为至少有一个问题在这里:

public class OrderTypeA extends Order {
protected List<OrderLineTypeA> orderLines;

@Override
public List<OrderLineTypeA> getOrderLines() {
    return orderLines;
}

@Override
public void setOrderLines(List<OrderLine> orderLines) {
    this.orderLines = (List<OrderLineTypeA>)orderLines; // does not compile
}
}

在 OrderTypeA 的 setOrderLines() 中,您尝试将 OrderLine 类型的列表分配给 OrderLineTypeA 类型的列表。为子类分配其父类型不起作用。

【讨论】:

  • 问题是,如何实现呢?据我了解,OP 希望在这堂课中有List&lt;OrderLineTypeA&gt;,而不是List&lt;OrderLine&gt;。它必须被声明为setOrderLines(List&lt;OrderLineTypeA&gt; orderLines),但是从父级覆盖方法存在问题 - 这些将是不同的方法。
  • 演员阵容怎么样? this.orderLines = (List)orderLines;还在答案中对其进行了编辑
  • @Amongalen Order 将包含OrderLines 的列表,而OrderTypeA 将包含OrderLineTypeA 的列表。
  • 更新问题,代码块后我忘记换行了。
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2020-02-09
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多