我确实应该知道这一点,但是由于某些原因,我不理解以下内容。
我的抽象类包含以下抽象方法:
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定义的契约(Contract)。
但是,子类中的方法可以返回EvaluationRuleDTO的实例而不是RuleDTO,因为契约(Contract)要返回RuleDTO,而EvaluationRuleDTO是RuleDTO。