代码之家  ›  专栏  ›  技术社区  ›  user9159218

重写而不调用父方法,违反了Liskov原则

  •  2
  • user9159218  · 技术社区  · 6 年前

    我正在开发一个简单的项目。在我的项目中,我与Liskov原则的含义有冲突。

    我用以下示例简化了我的项目问题:

    public class Animal {  
    
         public void feed() {     
    
             // do something here         
         }    
    }    
    
    
    public class Dog extends Animal {
    
        // some methods and attributes
    
        @Override
        public void feed() {   
    
            // never call parent feed() method (super.feed())
        }
    }
    

    所以,我的问题是,如果我不调用父方法并在override方法中编写一个全新的代码,这是否违反了Liskov原则?

    谢谢

    2 回复  |  直到 6 年前
        1
  •  4
  •   Dylon    6 年前

    不,只要子类的实现满足基类的期望,它就不会违反Liskov原则。

        2
  •  1
  •   fxrbfg    6 年前

    LSP原则是关于合同的,当你有动物实例或从某人那里得到它并试图喂养它时,你假设狗做它应该做的事,而不是飞走或试图杀死你。履行动物契约的正确的狗执行应该适合每一个期望动物的地方。当狗做了一些奇怪的事情(合同中没有的事情)就违反了LSP。当LSP履行合同时,如何准确地实现dog方法与LSP的上下文无关。

    可替换性是面向对象编程中的一个原则,它指出,在计算机程序中,如果S是T的子类型,则T类型的对象可以替换为S类型的对象(即,T类型的对象可以替换为任何子类型的对象),而不改变T的任何期望属性(正确性、执行的任务等)。

    https://en.wikipedia.org/wiki/Liskov_substitution_principle