摘要:
用一个子类来代替基类,程序的行为不变,那么就符合里氏替换。最常见的违反里氏替换原则的例子:子类存在空的虚函数即一个子类对于基类的某些方法进行屏蔽将其改成空函数。也成为子类的退化。里氏替换的意义在于更好的实现OCP。如果我们的子类不能完全的代替基类,那么基类的抽象就是有问题的,必然会导致,在拓展子类功能的时候需要修改基类。判断是否符合里氏替换的方法是判断两个类是否存在IS-A的关系,即子类是一个基类吗?比如说,鸭子是鸟吗?但符合IS-A的关系的对象不一定符合里氏替换。还要看对象的特性,即可能产生变化的和地方。比如说正方形是一个长方形,这个事没有问题的。 1 class Rectangle... 阅读全文
摘要:
软件应该是可以扩展的,但是不可以修改的。对扩展都是开放的,模块式可以扩展来满足新的行为,我们可以改变模块的功能。OCP的好处是,尽可能的减少修改模块的次数和范围,从而提高代码的可维护性,复用性。比如操作系统的升级补丁,在修复bug的情况下,肯定是越小越小。如果说OCP做的不好,每次修改需要修改大量的文件,那就会导致补丁很大。对于修改是封闭的,在扩展模块的时候,不必改动源代码的二进制文件,不管是.o文件还是.dll文件都不用改动。问题的核心是怎么样改变了模块的功能却又不改变模块的代码呢?关键是抽象!比如说,client类会调用server的一些接口,这样就会对server产生依赖,如果想换一个s 阅读全文