我能够大致了解LSP及其违规行为。比如说,正方形扩展具有setWidth()和setHeight()函数的矩形是对LSP的微妙违反,因为有额外的要求。类似地,GreenDuck使用函数something(Grass g)扩展Duck类时,不能有额外的子句要求Grass为绿色。
对于正方形和矩形场景,我认为实现多边形接口以及矩形和正方形类以各自的方式实现多边形是正确的。对于GreenDuck场景,GreenDuck使用构图将Duck作为其字段之一可能是一个好主意。
Q1)我对上述两种情况的理解正确吗?
问题2)此外,我无法对LSP允许“扩展”的场景进行建模,这就引出了问题。是否有人可以深入研究LSP,并提供一些具体的例子,说明在哪些方面扩展是合适的,如果在某些方面组合不太好,那么就有额外的好处了。
编辑:为了清楚起见
在Liskov的上下文中,区分检查接口和修改接口非常重要。正方形“是一个”矩形,就像矩形一样,你可以得到它的高度和宽度。它不同于矩形,因为你不能单独设置它的高度和宽度。所以,如果你所说的“实现多边形接口是正确的”,你的意思是矩形
应该有一个getPolygonVerders
函数,那么当然,没关系。但是,如果您的意思是它应该实现一个具有setPolygonVerders
的接口,那么这是错误的,原因与Square
不能具有setHeightAndWidth
类似于Rectgle
相同。
至于GreenDuck
拥有Duck
成员。。。。呃。。。那会有点奇怪。鸭子里面通常有其他的鸭子吗?
里氏代换原则由2008年图灵奖得主、美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出。其严格表述如下:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。这个定义比较拗口且难以理解,因此我们一般使用它的另一个通俗版定义
概述 在工作初期,我们可能会经常会有这样的感觉,自己的代码接口设计混乱、代码耦合较为严重、一个类的代码过多等等,自己回头看的时候都觉得汗颜。再看那些知名的开源库,它们大多有着整洁的代码、清晰简单的接口、职责单一的类,这个时候我们通常会捶胸顿足而感叹:什么时候老夫才能写出这样的代码! 相关资料 iOS AFNetworking2.0源码解析 AFNetworking源码 单一原则(Single Re
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle )。 英文原文:http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/ 开闭原
本文向大家介绍PHP面向对象之里氏替换原则简单示例,包括了PHP面向对象之里氏替换原则简单示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP面向对象之里氏替换原则。分享给大家供大家参考,具体如下: 里氏替换原则(Liskov Substitution Principle) 里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,
我正试着写一个程序,把华氏温度转换成摄氏温度。用户输入华氏温度值,程序打印出摄氏温度值。用户应该输入212作为华氏温度值,程序应该计算100.0作为摄氏温度值,但是当我想要得到100.0时,我却得到0.0作为摄氏温度值 我不确定问题可能出在哪里。操作顺序是可能的吗? 将摄氏温度转换为华氏温度的公式为:< code>C = 5 / 9 (F - 32)
你好,我对Java很陌生,所以我仍然很熟悉它。现在我正在做一个课堂实验室,我已经基本弄清楚了,但是有一个部分我们需要将摄氏度转换为华氏度。我有点难过,因为我们需要将第一次转换保留为int数据类型。 在我们的实验室中,我们有测试类,根据测试类,第一个转换(int数据类型)输入-40摄氏度,运行转换方法,结果应该是-40华氏度。 这实际上是我正在编写的一个名为Conversion的用户定义类。 下面是