派生后覆盖了某个子程序,但在其中没做任何操作,这种情况也值得怀疑这通常表明基类的设计中有错误。

 

举例来说,假设你有一个Cat(猫)类,它有一个Scratch()(抓)成员函数,可是最终你发现有些猫的爪尖儿没了,不能抓了。你可能想从Cat类派生一个叫 scratchiesscat(不能抓的猫)的类,然后覆盖scratch()方法让它什么都不做。但这种做法有这么几个问题。 它修改了 cat 类的接口所表达的语义,因此破坏了Cat 类所代表的抽象(即接口契约) 当你从它进一步派生出其他派生类时,采用这一做法会迅速失控。如果你又发现有只猫没有尾巴该怎么办?或者有只猫不捉老鼠呢?再或者有只猫不喝牛奶?最终你会派生出一堆类似ScratchlessTaillessMicelessMi1klessCat(不能抓、没尾巴、不捉老鼠、不喝牛奶的猫)这样的派生类来。 采用这种做法一段时间后,代码会逐渐变得混乱而难以维护,因为基类的接口和行为几乎无法让人理解其派生类的行为。 修正这一问题的位置不是在派生类,而是在最初的Cat类中。应该创建一个Claw(爪子)类并让Cat类包含它。问题的根源在于做了所有猫都能抓的假设,因此应该从源头上解决问题,而不是到发现问题的地方修补。