我真的应该知道这一点,但出于某种原因我不理解以下内容.
我的抽象类包含以下抽象方法:
protected abstract RuleDTO createRowToBeCloned(RuleDTO ruleDTO);
Run Code Online (Sandbox Code Playgroud)
我还有另一个课程如下:
EvaluationRuleDTO extends from RuleDTO
Run Code Online (Sandbox Code Playgroud)
然后在我的抽象类的子类中,我有以下实现,由于"必须覆盖或实现超类型方法",这是不允许的:
protected EvaluationRuleDTO createRowToBeCloned(EvaluationRuleDTO ruleDTO) {
Run Code Online (Sandbox Code Playgroud)
但是,允许以下内容:
protected EvaluationRuleDTO createRowToBeCloned(RuleDTO ruleDTO) {
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是一个基本问题,但我有点困惑.为什么我可以在重写方法中返回RuleDTO的子类,但是我不能传入子类?
谢谢
JB *_*zet 11
你打破了Liskov原则:超类可以做的所有事情,子类必须能够做到.超类声明了一种接受任何类型的RuleDTO的方法.但是在您的子类中,您只接受EvaluationRuleDTO的实例.如果您执行以下操作会发生什么?
RuleDTO rule = new EvaluationRuleDTO();
rule.createRowToBeCloned(new RuleDTO());
Run Code Online (Sandbox Code Playgroud)
EvaluationRuleDTO是RuleDTO,因此它必须履行RuleDTO定义的合同.
但是,子类中的方法可能返回EvaluationRuleDTO的实例而不是RuleDTO,因为合同是返回RuleDTO,而EvaluationRuleDTO是RuleDTO.
归档时间: |
|
查看次数: |
4106 次 |
最近记录: |