里氏替换原则第定义是:所有引用基类的地方必须能透明地使用其子类的对象。
我们知道,面相对象的语言的三大特点是继承、封装、多态,里氏替换原则就是依赖于继承、多态这两大特性。里氏替换原则简单来说就是,所有引用基类的地方必须能透明地使用其子类的对象。通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不回产生任何错误和异常,使用者可能根本就不需要知道是父类还是子类。但是,单过来就不行了,有子类出现的地方,父类未必就能适应。说了那么多,其实最终总结就两个字:抽象。
小明为了深入地了解Android中的Window和View的关系,特意写了一个简单示例,为了我们看看具体的代买实现。




上述示例中,Window依赖于View,而View定义了一个视图抽象,measure是各个子类共享的方法,子类通过覆盖View的draw方法实现具有各有各自特色的功能,在这里,这个功能就是绘制自身的内容。任何继承自View的子类都可以传递给show函数,就是所说的里氏替换。通过里氏替换,就可以自定义各式各样、千变万化的View,然后传递给Window,Window负责组织View,并且将View显示到屏幕上。
里氏替换原则的核心原理是抽象,抽象又依赖继承这个特性,在oop当中,继承的优缺点都相当明显。优点有以下几点:
(1)代码重用,减少创建类的成本,每个子类都拥有父类的方法和属性;
(2)子类与父类基本相似,但又与父类有所区别;
(3)提高代码的可扩展性。
继承的缺点
(1)继承是侵入性的,只要继承就必须拥有父类的所有属性和方法
(2)可能造成子类代码泟与、灵活性降低,因为子类必须拥有父类的属性和方法。
失误总是具有两面性,如何权衡利与弊都是需要根据具体情况来做出选择并加以处理。里氏提示原则指导我们构建扩展性更好的软件系统,我们还是接着上面的ImageLoader来说明。
图1-2所示也很好地反应了里氏替换原则,即MemoryCache、DiskCache、DoubleCache都可以替换ImageCache的工作,并且能够保证行为的正确性。ImageCache建立获取缓存图片、保存缓存图片的接口规范,MemoryCache等根据接口规范了相应的功能,用户只需要在使用时指定具体的缓存对象就可以动态地替换ImageLoader中的缓存策略。这就使得ImageLoader的缓存系统有了无限的可能性,也就是保证了扩展性。
想象一种情况,当ImageLoader中的setImageCache中的cache对象不能够被子类所替换,那么用户如何设置不同的缓存对象,以及用户如何自定义自己的缓存实现,通过里氏扩展
网友评论