🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 派生后覆盖了某个子程序,但是其中没有做任何操作,这种情况也值得怀疑 举例: 假设你有一个Cat(猫)类,它有一个Scratch()(抓)成员函数,可是最终你发现有些猫的爪尖儿没了,不能抓了你可能想从Cat类派生一个叫 Scratchiesscat(不能抓的猫)的类,然后覆盖Scratch(方法让它什么都不做。但这种做法有这么几个问题。 * 它修改了cat类的接口所表达的语义,因此破坏了Cat类所代表的抽象(即接口契约)。 * 当你从它进一步派生出其他派生类时,采用这一做法会迅速失控。如果你又发现有只猫没有尾巴该怎么办?或者有只猫不捉老鼠呢?再或者有只猫不喝牛奶?最终你会派生出一堆类似 (不能抓、没尾巴、不捉老鼠、不喝牛奶的猫)这样的派生类来。 修正这一问题 在最初的Cat类中。应该创建一个Claw(爪子)类并让Cat类包含它。问题的根源在于做了所有猫都能抓的假设因此应该从源头上解决问题,而不是到发现问题的地方修补。 ## 避免让继承体系过深 ## 对其他类的子程序的间接调用要尽可能少 如果A对象创建了一个B对象,它也可以调用B对象的任何(公用)子程序,但是它应 该避免再调用由B对象所提供的对象中的子程序。