gpt4 book ai didi

Java:覆盖子类中的抽象方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:19 26 4
gpt4 key购买 nike

我真的应该知道这一点,但出于某种原因我不明白以下内容。

我的抽象类包含以下抽象方法:

protected abstract RuleDTO createRowToBeCloned(RuleDTO ruleDTO);

我还有另外一个类如下:

EvaluationRuleDTO extends from RuleDTO

然后在我的抽象类的子类中,我有以下实现,由于“必须覆盖或实现父类(super class)型方法”而不允许:

protected EvaluationRuleDTO createRowToBeCloned(EvaluationRuleDTO ruleDTO) {

但是,以下是允许的:

protected EvaluationRuleDTO createRowToBeCloned(RuleDTO ruleDTO) {

我意识到这可能是一个基本问题,但我有点困惑。为什么我可以在重写的方法中返回一个RuleDTO的子类,但是我不能传入一个子类?

谢谢

最佳答案

您违反了 Liskov 原则:父类(super class)可以做的一切,子类也必须能够做。父类(super class)声明了一个接受任何类型 RuleDTO 的方法。但是在您的子类中,您只接受 EvaluationRuleDTO 的实例。如果您执行以下操作,会发生什么情况?

RuleDTO rule = new EvaluationRuleDTO();
rule.createRowToBeCloned(new RuleDTO());

EvaluationRuleDTO 是一个 RuleDTO,因此它必须满足 RuleDTO 定义的契约。

不过,子类中的方法可能会返回 EvaluationRuleDTO 的实例而不是 RuleDTO,因为契约(Contract)将返回 RuleDTO,而 EvaluationRuleDTO 是 RuleDTO。

关于Java:覆盖子类中的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com